python plotly - 悬停有时会显示多个值

Posted

技术标签:

【中文标题】python plotly - 悬停有时会显示多个值【英文标题】:python plotly - hovering shows more than one value sometimes 【发布时间】:2021-08-26 07:18:53 【问题描述】:

问题

我有一个由多个 go.Scatter 图组成的绘图图 (figure),使用 fig.add_trace(<the_data>) 添加到图中。

有些散点图共享相同的索引,有些则不共享。当悬停在两个图表之间的连接上方时不共享相同的incides我看到多个标签。

在图片中,您可以看到一个例子:而不是只看到 green 标签或 blue+red(它们组成一个单元,因为它们共享相同的事件),我都看到了。我怎样才能让它只显示其中一个?

注意事项

    当悬停在两个线段之间没有连接的点上方时,我确实得到了想要的结果:如果我在绿色之上,则为绿色,如果我在蓝色+红色之上,则为蓝色+红色。 我尝试从默认的“x”更改hovermode 参数,但找不到有效的模式。最接近的选项是closest,但只使用一种颜色:greenbluered 而不是 greenblue+red 根据需要。 当放大到足够大时,它会显示所需的标签(但让用户一直放大当然不是解决方案)。

代码

import plotly.graph_objs as go
import numpy as np

sc0 = go.Scatter(
    'x': np.array(['21/Jun/09 11:03', '21/Jun/09 11:04'], dtype=object),
    'y': np.array([17.407997, 17.372826], dtype=np.float32)
)

sc1 = go.Scatter(
    'x': np.array(['21/Jun/09 11:03', '21/Jun/09 11:04'], dtype=object),
    'y': np.array([17.352034, 17.33715], dtype=np.float32)
)
sc2 = go.Scatter(
    'x': np.array(['21/Jun/09 11:05', '21/Jun/09 11:06', '21/Jun/09 11:07',
                '21/Jun/09 11:08', '21/Jun/09 11:09', '21/Jun/09 11:10',
                '21/Jun/09 11:11', '21/Jun/09 11:12', '21/Jun/09 11:13',
                '21/Jun/09 11:14', '21/Jun/09 11:15', '21/Jun/09 11:16',
                '21/Jun/09 11:17', '21/Jun/09 11:18', '21/Jun/09 11:19',
                '21/Jun/09 11:20', '21/Jun/09 11:21', '21/Jun/09 11:22',
                '21/Jun/09 11:23', '21/Jun/09 11:24', '21/Jun/09 11:25',
                '21/Jun/09 11:26', '21/Jun/09 11:27', '21/Jun/09 11:28',
                '21/Jun/09 11:29', '21/Jun/09 11:30', '21/Jun/09 11:31',
                '21/Jun/09 11:32', '21/Jun/09 11:33', '21/Jun/09 11:34',
                '21/Jun/09 11:35', '21/Jun/09 11:36', '21/Jun/09 11:37',
                '21/Jun/09 11:38', '21/Jun/09 11:39', '21/Jun/09 11:40',
                '21/Jun/09 11:41', '21/Jun/09 11:42', '21/Jun/09 11:43',
                '21/Jun/09 11:44', '21/Jun/09 11:45', '21/Jun/09 11:46',
                '21/Jun/09 11:47', '21/Jun/09 11:48', '21/Jun/09 11:49',
                '21/Jun/09 11:50', '21/Jun/09 11:51', '21/Jun/09 11:52',
                '21/Jun/09 11:53', '21/Jun/09 11:54', '21/Jun/09 11:55',
                '21/Jun/09 11:56', '21/Jun/09 11:57', '21/Jun/09 11:58',
                '21/Jun/09 11:59', '21/Jun/09 12:00', '21/Jun/09 12:01',
                '21/Jun/09 12:02', '21/Jun/09 12:03', '21/Jun/09 12:04',
                '21/Jun/09 12:05', '21/Jun/09 12:06', '21/Jun/09 12:07'], dtype=object),
    'y': np.array([17.340586, 17.058613, 17.268505, 17.234064, 17.699133, 17.164728,
                17.129848, 17.094318, 17.058613, 17.020906, 16.992136, 16.98427 ,
                16.988392, 17.00848 , 17.031954, 17.051336, 17.054792, 17.041235,
                17.029837, 17.058613, 16.801, 16.969503, 16.235737, 16.97139 ,
                16.801, 16.977226, 16.965315, 16.958202, 16.235737, 16.955463,
                16.029837, 17.052027, 17.058613, 17.235737, 17.332283, 17.239872,
                17.129492, 17.058096, 16.801, 16.81308 , 16.699133, 16.591547,
                16.490868, 16.403502, 16.321527, 16.411316, 16.801, 16.698566,
                16.810646, 16.893055, 16.235737, 17.058613, 17.060478, 17.033163,
                16.998907, 16.966124, 16.235737, 16.911512, 16.886219, 16.235737,
                16.839949, 16.235737, 16.801], dtype=np.float32)
)

data = [sc0, sc1, sc2]

layout = go.Layout(
        margin=dict(t=20, l=40, r=20, b=40),
        hovermode='x'
    )

fig = go.Figure(layout=layout)
for item in data:
    fig.add_trace(item)
fig.show()

图表示例

【问题讨论】:

这种情况是由相邻数据点的接近造成的。如果您选择一个矩形并放大包含图像中显示的三个点的区域,您将看到绿点不重叠。另外,对于初始显示,我认为 hovermode='closest' 是最好的。 @r-beginners 遗憾的是,放大并不是一个真正的解决方案,正如我所说的 hovermode='closest' 不会同时显示红色和蓝色,所以它也不能很好地工作。跨度> 据我所知,不幸的是,数据是相邻的,所以它不会是你想要的。 @r-beginners 我会继续寻找。同时,有没有办法指定要显示的悬停框的最大值? 你的意思是对悬停框中的项目数量的限制吗?如果你写在悬停模板中,没有限制。 【参考方案1】:

您可以手动设置hoverdistance。将其设置为 2 像素应该可以为您解决问题:

layout = go.Layout(
    margin=dict(t=20, l=40, r=20, b=40),
    hovermode='x',
    hoverdistance=2,
)

换句话说,现在光标需要靠近一个点(沿 x 轴)2 个像素才能显示其悬停。

【讨论】:

请注意,只要您不想同时触发悬停的两个数据点之间的距离大于 4 像素,这将起作用,这取决于数据点的数量、图形缩放和屏幕分辨率。因此,它不是一个全局解决方案,但应该适用于广泛的常见情况,包括问题中提供的图表。如果你设置hoverdistance=1,这个最小距离限制变成2个像素。

以上是关于python plotly - 悬停有时会显示多个值的主要内容,如果未能解决你的问题,请参考以下文章

Python/Plotly:如何使用要显示的信息自定义悬停模板?

如何在 Python 3 的 Plotly 中将其悬停在折线图中一次显示数据点及其标签?

Python & Plotly:将悬停数据添加到密度热图

自定义悬停框 Plotly:Python 以适应文本

单击时显示悬停而不是悬停在plotly python中的数据点上?

R plotly禁用默认悬停文本并仅显示自定义文本