【问题标题】:Highcharts show max., min., and average for each serie in legendHighcharts 显示图例中每个系列的最大值、最小值和平均值
【发布时间】:2017-07-23 17:58:20
【问题描述】:

我有一些图表,最好分别显示每个系列的最小值最大值平均值。在传说中不是“必须”,但它会非常好。另一种解决方案可能是在图表中(点)显示最小值、最大值和实际值,这也是一个非常好的解决方案。目前在不同的图表中,系列的数量从 1 到 4 不等。

实际值(或实际的最新值)已在图例中。

此外,我希望在首次加载和更改缩放时“始终”更新这些值。更改缩放时应基于选择,因此选择“1 m”时必须显示上个月的值,依此类推。

http://jsfiddle.net/dg4wpg0t/1/

任何帮助表示赞赏:)

最终结果的一个示例(红色文本):

Highcharts.stockChart('container', {

chart: {
    zoomType: 'x'
},

legend: {
    enabled: true,
    labelFormatter: function() {
        var lastVal = this.yData[this.yData.length - 1];
        return this.name + '<br>' + 'Now: ' + lastVal + ' °C';
        }
},

  series: [{
    name: 'Outside',
    data: [
        [Date.UTC(2016, 01, 01), 0.2],
        [Date.UTC(2016, 01, 06), -1.4],
        [Date.UTC(2016, 01, 11), -2.6],
        [Date.UTC(2016, 01, 16), 11.1],
        [Date.UTC(2016, 01, 21), -11.1],
        [Date.UTC(2016, 01, 26), 3.7],
        [Date.UTC(2016, 02, 01), 4.9],
        [Date.UTC(2016, 02, 06), 8.2],
        [Date.UTC(2016, 02, 11), 0.2],
        [Date.UTC(2016, 02, 16), -1.4],
        [Date.UTC(2016, 02, 21), -2.6],
        [Date.UTC(2016, 02, 26), -5.1],
        [Date.UTC(2016, 03, 01), -8.3],
        [Date.UTC(2016, 03, 06), 3.7],
        [Date.UTC(2016, 03, 11), 4.9],
        [Date.UTC(2016, 03, 16), 5.2],
        [Date.UTC(2016, 03, 21), 0.2],
        [Date.UTC(2016, 03, 26), -1.4],
        [Date.UTC(2016, 04, 01), -2.6],
        [Date.UTC(2016, 04, 06), -5.1],
        [Date.UTC(2016, 04, 11), -8.3],
        [Date.UTC(2016, 04, 16), 11.2],
        [Date.UTC(2016, 04, 21), -11.2],
        [Date.UTC(2016, 04, 26), 5.2]
        ]
    }, {
    name: 'Inside',
    data: [
        [Date.UTC(2016, 01, 01), 17.8],
        [Date.UTC(2016, 01, 06), 27.1],
        [Date.UTC(2016, 01, 11), 17.1],
        [Date.UTC(2016, 01, 16), 21.7],
        [Date.UTC(2016, 01, 21), 25.3],
        [Date.UTC(2016, 01, 26), 24.3],
        [Date.UTC(2016, 02, 01), 22.3],
        [Date.UTC(2016, 02, 06), 24.1],
        [Date.UTC(2016, 02, 11), 19.8],
        [Date.UTC(2016, 02, 16), 20.2],
        [Date.UTC(2016, 02, 21), 26.5],
        [Date.UTC(2016, 02, 26), 21.7],
        [Date.UTC(2016, 03, 01), 25.3],
        [Date.UTC(2016, 03, 06), 24.3],
        [Date.UTC(2016, 03, 11), 22.3],
        [Date.UTC(2016, 03, 16), 24.1],
        [Date.UTC(2016, 03, 21), 19.8],
        [Date.UTC(2016, 03, 26), 20.2],
        [Date.UTC(2016, 04, 01), 24.5],
        [Date.UTC(2016, 04, 06), 21.7],
        [Date.UTC(2016, 04, 11), 27.2],
        [Date.UTC(2016, 04, 16), 17.2],
        [Date.UTC(2016, 04, 21), 22.3],
        [Date.UTC(2016, 04, 26), 24.1]
        ]
    }]

});

【问题讨论】:

    标签: javascript charts highcharts highstock


    【解决方案1】:

    您需要在图表开始(加载事件)和redraw event 上进行计算。您可以禁用数据分组 - 对于您拥有的数据量,数据分组不是必需的 - 禁用它可以简化数据抓取。

    1. 过滤可见点
    2. 为他们做统计
    3. 替换图例中的文字

    功能:

    function calculateStatistics() {
          this.series.slice(0, 2).forEach(series => { // take only two first series, the last is for the navigator
            const data = series.data.filter(point => point.isInside).map(point => point.y); // grab only points within the visible range
    
            // calculate statistics for visible points
            const statistics = [
              data[data.length - 1],
              Math.max.apply(null, data),
              Math.min.apply(null, data),
              (data.reduce((a, b) => a + b, 0) / data.length).toFixed(1)
            ];
    
            const legendItem = series.legendItem;
            let i = -1;
            // construct the legend string
            const text = legendItem.textStr.replace(/-?\d+\.\d/g, () => statistics[++i]);
    
            // set the constructed text for the legend
            legendItem.attr({
              text: text
            });
          });
        }
    

    并在事件上设置函数

    chart: {
        zoomType: 'x',
        events: {
          load: calculateStatistics,
          redraw: calculateStatistics
        }
    },
    

    样式文字可以在legend.labelFormatter中完成

    实时示例和输出

    http://jsfiddle.net/jfLtodf9/

    【讨论】:

    • 谢谢!最后我实际上需要进行数据分组,这只是一个简单的图表示例,但我们暂时不要关注它......还有一个问题,如果在 Legend 中放入一个没有小数的值,则该值将冻结而不是再更新,可能是因为 textStr.replace 找不到“.”...?有什么好的解决方案吗? :) 我还希望将“现在”值(实际值)作为该系列的最新值,而不是通过选择过滤。另一方面,最小值、最大值和平均值都可以。 jsfiddle.net/jfLtodf9/1
    • 您需要调整我使用的正则表达式 - 它不适用于数字的每种表示形式 - 如果您有奇怪格式的数据,也许最好构建一个全新的字符串而不是替换一个存在的。要访问未过滤的数据,请使用 series.data - jsfiddle.net/wd0waL0s
    • 还没有……我添加了更多数据只是为了测试,当我放大和更改选择值时,它们并没有按应有的方式更新。 jsfiddle.net/wd0waL0s/3
    • 您可以构建一个新字符串,而不是替换现有字符串。 jsfiddle.net/wd0waL0s/5
    • 非常感谢您的帮助!现在,我正在尝试根据您为我制作的函数在图表中以最大值和最小值添加数据标签:) 我尝试使用一些手动输入的值(在事件 afterSetExtremes 时),所以这基本上是我想要的结束,但在重绘和加载时更新,就像图例一样。也许图表更新不是要走的路。 jsfiddle.net/wd0waL0s/7
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-16
    相关资源
    最近更新 更多