当然有一种方法可以计算缩放或任何更改视图后显示的所有点并对此做出反应。
我的目标是在Highchart 7.2.0stockChart中,如果"查看点">x"圆半径",超过(>(">视口像素">,我只是隐藏它们,或者对点做一些特别的事情,因为其中一些是特殊的,仍然应该显示。
所以我需要:
- 如何获得:刚刚查看的点数(不对所有数据加"FOR"(
(我只是认为如果没有真正的方法,最好是计算 svg 对象而不是:计算我的所有数据并使用带有最小值和最大值的isInside(
- 最佳事件:">afterSetExtremes"和">events:{redraw:" [我认为已解决]
events: {
afterSetExtremes: function(event) {
console.log(event.min);
console.log(event.max);
}
}
- 我如何关闭它们[我认为已解决]
if (chart.userOptions.plotOptions.line.marker.enabled) {
chart.userOptions.plotOptions.line.marker.enabled=false;
chart.update({
plotOptions: {
marker: {
enabled:false
}
}
});
}
- 如果有像"amchart"选项这样的自动方式,我只需问"标记:{启用:真"(没有问题时(和">标记:{启用:假"当它很紧时。[我认为已解决]
由此解决:
plotOptions: {
series: {
marker: {
enabled:undefined,
enabledThreshold: 4,
symbol: 'circle',
radius: 4,
},
}
}
是这样的:
标记:{启用:真, 启用阈值:0,(默认情况下(
应该是 :
标记:{启用:未定义, 启用阈值:4,(大于零(
从这里得到帮助:https://stackoverflow.com/a/54417034/7514010
最简单的方法是遍历数据并检查isInside
点属性或点位置。作为替代方法,您可以覆盖translate
方法并计算现有循环中可见点的数量:
var counter;
(function(H) {
H.Series.prototype.translate = function() {
...
counter = 0;
// Translate each point
for (i = 0; i < dataLength; i++) {
...
point.isInside =
plotY !== undefined &&
plotY >= 0 &&
plotY <= yAxis.len && // #3519
plotX >= 0 &&
plotX <= xAxis.len;
// CHANGE
if (point.isInside) {
counter++;
}
// CHANGE
...
}
series.closestPointRangePx = closestPointRangePx;
H.fireEvent(this, 'afterTranslate');
}
})(Highcharts)
现场演示:http://jsfiddle.net/BlackLabel/yx1cj0at/
文档:https://www.highcharts.com/docs/extending-highcharts
它在此链接的第三条评论中回答了@ppotaczek jsfiddle.net/BlackLabel/j1tLfaxu 以及 GitHub 问题:https://github.com/highcharts/highcharts/issues/12017
如果需要获取刚刚查看的点数(通过使用afterSetExtremes或重绘或渲染事件(:
chart: {
events: {
render: function() {
console.log(this.series[0].points.length)
}
}
},
- 也可以使用已处理的XData代替点
- 点对象有足够的选项,如isInside:
this.series[0].points[0].isInsdie.
因为第一个或最后一个点可能不显示,而只影响折线图中的线条或其他类型的图表,因为放大 Y 也未显示。
对于极端开始的计算,您可能需要:
this.series[0].cropStart
并将其与您的主要数据进行比较。