【问题标题】:HighCharts: Use shared tooltip only when series overlapHighCharts:仅在系列重叠时使用共享工具提示
【发布时间】:2013-09-24 17:34:52
【问题描述】:

在下面的HighCharts 示例中,系列AB 具有相同的数据。只有B 的线在图表绘图区域中可见,因为它直接绘制在A 上方。

最终用户不可能知道AB 后面。

我们可以在配置对象中设置tooltip.shared = true,以在悬停在任何系列上时显示给定x轴点的所有数据值。但是,在我的真实示例中,我在图表上绘制了多达 50 个系列,这是不合适的。

是否可以保持tooltip.shared = false 的行为,但是当用户将鼠标悬停在与一个或多个系列重叠的系列上时,在工具提示中显示所有(且仅)重叠系列值?或者是否有任何其他用户友好的方式来表明在给定的 x 值处有 2+ 个相同的 y 值?

http://jsfiddle.net/adamtsiopani/XbYZz/

$(function () {
    $('#container').highcharts({
        xAxis: {
            categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
                'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
        },
        tooltip: {
            valueSuffix: '°C'
        },
        series: [{
            name: 'Tokyo',
            data: [7.0, 6.9, 9.5, 14.5, 18.2, 21.5, 25.2, 26.5, 23.3, 18.3, 13.9, 9.6]
        }, {
            name: 'New York',
            data: [7.0, 6.9, 9.5, 14.5, 18.2, 21.5, 25.2, 26.5, 23.3, 18.3, 13.9, 9.6]
        }, {
            name: 'Berlin',
            data: [-0.9, 0.6, 3.5, 8.4, 13.5, 17.0, 18.6, 17.9, 14.3, 9.0, 3.9, 1.0]
        }, {
            name: 'London',
            data: [3.9, 4.2, 5.7, 8.5, 11.9, 15.2, 17.0, 16.6, 14.2, 10.3, 6.6, 4.8]
        }]
    });
});

http://jsfiddle.net/adamtsiopani/XbYZz/

【问题讨论】:

标签: javascript highcharts highstock


【解决方案1】:

Highcharts 还没有解决方案。它们具有隐藏一个系列的功能,以便其他系列可见,这是一个不错的选择。但是,如果您需要在 2 系列重叠时获得共享工具提示,则可以如下面的小提琴所示完成。

$(function () {
    var series1 = [29.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4];

    var series2 = [24.9, 50.5, 106.4, 90.2, 80.0, 150.0, 160.6, 170.5, 160.4, 180.1, 95.6, 54.4];

    $('#container').highcharts({
        xAxis: {
            categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
        },
        tooltip: {
            formatter: function () {
                var s1 = this.series.chart.series[0].processedYData[this.point.index];
                var s2 = this.series.chart.series[1].processedYData[this.point.index];
                if (s1 == s2) {
                    return '<b>' + this.series.chart.series[0].name + ' :' + s1 + '</b><br/><b>' + this.series.chart.series[1].name + ' :' + s2 + '</b><br/>in month : ' + this.x;
                }
                return '<b>' + this.series.name + ' :' + this.y + '</b><br/>in month : ' + this.x;
            }
        },
        series: [{
            data: series1
        }, {
            data: series2
        }]
    });
});

http://jsfiddle.net/Malinga/2jbdqe6x/7/

参考:http://www.malinga.me/highcharts-shared-tooltips-only-in-overlapping-points/#more-109

【讨论】:

  • 非常好!这是一个更新的示例,其中包含以像素为单位测量距离的动态图表大小:jsfiddle.net/2jbdqe6x/9
  • Malinga,感谢您对此的投入。我已将正确答案更改为您的。我也喜欢@Sphinxxx 输入,也许您可​​以更新答案以显示他作为替代方法。
【解决方案2】:

除非精心设计了解决方法,否则 highcharts 尚不支持此功能。请参阅此帖子(其中有一位自称是 highcharts 工程师的用户的评论):

is a way to see all data in tooltip when the points are overlap with each other(or very close), but see only one data when a point is far from others

我猜你只需要依靠用户使用图例来取消选择阻止另一个系列的系列。

【讨论】:

  • 感谢您的信息。由于我展示的系列数量众多,依赖使用图例的用户也不理想。我不得不禁用用户按图例隐藏/显示系列的功能,因为它会遇到大量系列的主要性能问题。我希望能偶然发现“一个精心设计的解决方法”!
  • @PawełFus 哈哈,我以为我对你的评论投了赞成票,但不得不这样做。
【解决方案3】:

作为用户,如果在图表上看到 50 个系列,我会感到困惑——这样可读吗?好主意是使用单独的 yAxis 或单独的窗格,但仍然是 50 系列..

但是,您可以采取一些解决方法。不要使用共享工具提示,而是在工具提示格式化程序中,获取实际的 x-index(例如 var xIndex = series.xData.indexOf(this.x);)然后遍历所有系列,从系列数据中获取值(例如 var yValue = series.yData[xIndex];)。现在与this.y 进行比较,如果值相似,则在返回的工具提示中添加更多点。

【讨论】:

  • 我将尝试实施此解决方案,如果我得到它的工作,我将发布 jsFiddle 更新并将您的答案标记为正确。
  • 关于“单独的 yAxis 或单独的平面”上的 cmets,您可以发布一个有效的 jsFiddle 示例吗?该图表看起来令人困惑,但是,如果用户仅根据 y 值识别前几个系列,则这些图表的主要用例是。在我们的系统中,这些是“问题系列”。然后,他们将鼠标悬停在该行上以查看它是什么系列,然后单击该行以深入了解相关数据。
  • 我尝试使用这种解决方案,但无济于事。似乎除非共享工具提示,否则您无法从格式化程序内部访问其他值点。也许你可以调用一个外部函数来帮忙?
  • 由于@Sualkcin 评论中的确切原因,我正在为此苦苦挣扎。还有其他方法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-01
  • 1970-01-01
相关资源
最近更新 更多