我正在尝试为我们的图表创建一个插件,该插件在数据流系列的最后一个数据上显示一个标记。该符号应仅显示在最新数据上。我在这里学到了我可以扩展原型并创建我的图表Here,如
(function (H) {
H.wrap(H.Chart.prototype, 'init', function(proceed) {
proceed.apply(this, Array.prototype.slice.call(arguments, 1));
};
H.wrap(H.Chart.prototype, 'redraw', function(proceed, points) {
proceed.apply(this, Array.prototype.slice.call(arguments, 1));
//Add my marker symbol here
});
}(Highcharts));
我测试了上面的两个事件,他们开始添加正确的时间。但是,我的点是一个布尔值,这不是我所期待的。我阅读了api文档Here 但还无法理解如何继续。如果有些人有更好的示例或指导如何使用扩展并实现这一点将非常感激。我的数据是流和连续数据,只需要在最新数据的顶部显示标记符号。
更新
感谢您的回应先生。我们正在使用react-highcharts,我注意到我无法访问图表加载事件。尽管如此,我注意到我可以扩展我的H.Series原型,如Here解释的那样,我的事件会在每一个新的刻度涂料上被触发。我现在将我的代码更新为
H.wrap(H.Series.prototype, 'drawGraph', function (proceed) {
proceed.apply(this, Array.prototype.slice.call(arguments, 1));
const { chart } = this;
renderSpotIndicator(chart);
});
function renderSpotIndicator(chart){
const series = chart.series[0],
len = series.data.length - 1,
lastPoint = series.data[len];
if(lastPoint){
lastPoint.update({
marker: {
enabled: true
}
});
}
}
当我跑步时,我注意到我的标记属性在我的lastPoint中不存在,因此它的投掷错误。我无法使用它。我被建议改为涂上标记。遵循示例Here。我将代码更改为
function renderSpotIndicator(chart){
const series = chart.series[0],
len = series.data.length - 1,
lastPoint = series.data[len];
if(lastPoint){
chart.renderer.circle(lastPoint.pointX, lastPoint.pointY, 5).attr({
fill: lastPoint.color,
padding: 10,
r: 5,
stroke: 'white',
'stroke-width': 1,
zIndex: 5
}).add();
}
}
以上也是错误。当我检查时,我注意到在我的lastPoint上没有可用的属性。我的lastPoint返回正确,但我无法在特定点上设置标记,因为该属性在lastPoint上不可用。先生,请各位帮忙。
答案 0 :(得分:1)
您可以编辑加载事件并提取系列的最后一个点。然后调用update以显示标记。每次刷新图表时(通过添加点),您都需要执行相同的步骤。提取最后一个点,更新标记(隐藏),添加点并显示最后一个标记。
var series = this.series[0],
len = series.data.length - 1,
lastPoint = series.data[len];
lastPoint.update({
marker: {
enabled: true
}
});
setInterval(function() {
var x = (new Date()).getTime(), // current time
y = Math.random();
len = series.data.length - 1;
series.data[len].update({
marker: {
enabled: false
}
}, false);
series.addPoint([x, y], true, true);
len = series.data.length - 1;
series.data[len].update({
marker: {
enabled: true
}
}, true);
}, 1000);