Вы можете достичь требуемого результата, используя класс Highcharts. SVGRenderer
. Вам нужно нарисовать путь и три круга и анимировать их, меняя их положение. Например:
chart: {
events: {
load: function() {
// set up the updating of the chart each second
var chart = this,
series = chart.series[0],
lastPoint = series.points[series.points.length - 1],
xPos = lastPoint.plotX + chart.plotLeft,
yPos = lastPoint.plotY + chart.plotTop,
pointerSize = 16;
var animatedPointGroup = this.renderer.g().attr({
translateX: xPos - pointerSize / 2,
translateY: yPos - pointerSize / 2
}).add();
var plotLine = this.renderer.path([
'M', chart.plotLeft, yPos,
'L', xPos, yPos
])
.attr({
stroke: '#008dc4',
'stroke-width': 1
})
.add();
var shadowCircle = this.renderer.circle(
pointerSize / 2,
pointerSize / 2,
pointerSize
).attr({
fill: '#d3d7de'
}).add(animatedPointGroup);
this.renderer.circle(
pointerSize / 2,
pointerSize / 2,
6
).attr({
fill: '#ffffff'
}).add(animatedPointGroup);
this.renderer.circle(
pointerSize / 2,
pointerSize / 2,
3
).attr({
fill: '#008dc4'
}).add(animatedPointGroup);
setInterval(function() {
var x = (new Date()).getTime(), // current time
y = Math.round(Math.random() * 100),
point,
xPos,
yPos;
series.addPoint([x, y], true, true);
point = series.points[series.points.length - 1];
xPos = point.plotX + chart.plotLeft;
yPos = point.plotY + chart.plotTop;
animatedPointGroup.animate({
translateX: xPos - pointerSize / 2,
translateY: yPos - pointerSize / 2
});
plotLine.animate({
d: [
'M', chart.plotLeft, yPos,
'L', xPos, yPos
]
});
shadowCircle.animate({
r: shadowCircle.attr('r') === pointerSize ? pointerSize / 2 : pointerSize
});
}, 1000);
}
}
}
Демонстрационная версия: http://jsfiddle.net/BlackLabel/z4c0or3u/
Справочник по API:
https://api.highcharts.com/class-reference/Highcharts.SVGRenderer
https://api.highcharts.com/class-reference/Highcharts.SVGElement#animate
https://api.highcharts.com/class-reference/Highcharts.SVGElement#attr