Highstock,在 setExtreme(缩放)之后获取显示点计数的真实方法 - 不使用 MIN 和 MAX 计算所有数据

Highstock, True way of Get count of shown points after setExtreme (Zooming) - WITHOUT counting all data with MIN and MAX

当然有一种方法可以计算缩放或任何更改视图后显示的所有点并对此做出反应。

我的目标是 Highchart 7.2.0 stockChart, IF "viewed points" x "radius of circles", 比 (>) "view-port pixels",我只是隐藏它们,或者用点做一些特殊的事情,因为其中一些是特殊的,仍然应该显示。

所以我需要:

  1. 如何获得:现在刚刚查看的点数(没有将 "FOR" 放入所有数据)

(我只是认为如果没有真正的方法,我最好计算 svg 对象而不是:计算我所有的数据并使用 isInsideminmax)

  1. 最佳事件:“afterSetExtremes”和“events:{redraw: " [我认为已解决]
              events: {
                afterSetExtremes: function(event) {
                      console.log(event.min);
                      console.log(event.max);
                  }
              }
  1. 我如何关闭它们[我认为已解决]
                    if (chart.userOptions.plotOptions.line.marker.enabled) {
                        chart.userOptions.plotOptions.line.marker.enabled=false;
                        chart.update({
                            plotOptions: {
                                marker: {
                                    enabled:false
                                }
                            }
                        });
                    }
  1. 如果有像 "amchart" 选项这样的自动方式,我只问 "marker: { enabled: true" (当没问题时)和 "marker: { enabled: false" 当它很紧时。 [我认为已解决]

由此解决:

        plotOptions: {
            series: {
                marker: {
                    enabled:undefined,
                    enabledThreshold: 4,
                    symbol: 'circle',
                    radius: 4,
                },
            }
        }

原来是这样的:

marker: {enabled:true, enabledThreshold: 0, (By Default)

应该是:

marker: {enabled:undefined, enabledThreshold: 4, (More than Zero)

从这里得到帮助:

最简单的方法是遍历数据并检查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 回答 in the third comment by this link jsfiddle.net/BlackLabel/j1tLfaxu and also in GitHub issues : https://github.com/highcharts/highcharts/issues/12017

如果需要获取现在刚刚查看的点数(通过使用 afterSetExtremesredrawrender 事件):

    chart: {
        events: {
            render: function() {
                console.log(this.series[0].points.length)
            }
        }
    },
  • processedXData 也可以用来代替 points
  • points 对象有足够的选项,例如 isInside :
this.series[0].points[0].isInsdie.

因为它是可能第一个或最后一个点不显示并且只影响折线图或其他类型的线条图表未显示,因为也放大了 Y。

如果只是计算极端开始的位置,您可能需要:

this.series[0].cropStart

并将其与您的主要数据进行比较。