Reputation: 4796
I'm doing some programmatic drawing in Highcharts using Highcharts.Renderer using path()
and rect()
. In the code below I have manually plotted the coordinates for the line and rect. In reality the are related to the main data series (dates with values).
How can I programmatically draw something and make the zoom work?
The main graph, with zoom:
chart: {
zoomType: 'x',
},
xAxis: {
categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
},
series: [{
data: [29.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4]
}]
The programmtic drawing:
chart.renderer.rect(100, 110, 100, 100, 5)
.attr({
'stroke-width': 2,
stroke: 'red',
fill: 'transparent',
zIndex: 3
})
.add();
var path = [
'M', 100, 100,
'L', 130, 110,
'L', 160, 105,
'L', 190, 150,
];
chart.renderer.path(path)
.attr({
'stroke-width': 2,
stroke: 'blue',
zIndex: 4
})
.add();
http://jsfiddle.net/n8ro1b9m/1/
Upvotes: 3
Views: 3698
Reputation: 5222
Right now you are not really using your chart values - you are drawing your rect and path independently from your series. You can connect your drawings with your chart using your point y and x values and Axis.toPixels() method: http://api.highcharts.com/highcharts/Axis.toPixels
$(function() {
var addRect = function(chart) {
$('.rect').remove();
var xAxis = chart.xAxis[0],
yAxis = chart.yAxis[0]
chart.renderer.rect(xAxis.toPixels(1), 110, xAxis.toPixels(2) - xAxis.toPixels(1), 100, 5)
.attr({
'stroke-width': 2,
stroke: 'red',
fill: 'transparent',
zIndex: 0
}).addClass('rect')
.add();
chart.renderer.rect(0, 0, chart.plotLeft, chart.chartHeight + chart.plotTop, 5)
.attr({
fill: 'white',
zIndex: 0
}).addClass('rect')
.add();
};
$('#container').highcharts({
chart: {
zoomType: 'x',
events: {
redraw: function() {
addRect(this);
},
load: function() {
addRect(this);
}
}
},
xAxis: {
categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
},
series: [{
data: [29.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4]
}]
});
});
Here you can see an example how it can work: http://jsfiddle.net/n8ro1b9m/4/
Upvotes: 7
Reputation: 2136
You can use the series.data
values in your function by using:
chart.series[0].data[i].y
With i
the number of the point in the series.
Is that what you want to do ?
Upvotes: 0