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

Posted

技术标签:

【中文标题】Python/Plotly:如何使用要显示的信息自定义悬停模板?【英文标题】:Python/Plotly: How to customize hover-template on with what information to show? 【发布时间】:2020-03-22 06:46:41 【问题描述】:

这是我的数据集:

在按锁定我的数据框并按分组后,我继续计算百分比增加/减少作为新列;它最终看起来像这样:

现在对于我的 Plotly 情节,我使用它来显示轨迹并添加一些悬停信息:

fig.add_trace(go.Scatter(x=group_dfff.Months, y=group_dfff.Amount, name=i,
                        hovertemplate='Price: $%y:.2f'+'<br>Week: %x'))

现在你可以看到有一个参数 hovertemplate 我可以在其中传递我的 x 和 y...但是,我不知道如何在其中包含我的 PERC_CHANGE 值.

问题:如何在hovertemplate 中包含其他想要的列的值?具体来说,我如何包含 PERC_CHANGE 值,因为我在下面显示了所需的输出:

我解决了我的具体问题,请查看下面的图片(添加第 3 个元素,请参阅 cmets),但是问题仍然存在,因为我看不到如何为第 4 个、第 5 个等元素执行此操作。

非常感谢您的帮助!

【问题讨论】:

所以我为这个特定的场景找出了我的问题......我必须添加'&lt;br&gt;%Change: %text'并在括号中指定text=group_dfff.PERC_CHANGE - 这可以按我的意愿工作。但是,text var 是一个内置的东西,所以我仍然不确定如何添加让我们说第四个,我希望在悬停数据点时拥有的第五个和更多标签......跨度> 【参考方案1】:

对于 Plotly Express,您需要在创建图窗时使用 custom_data 参数。例如:

fig = px.scatter(
    data_frame=df, 
    x='ColX', 
    y='ColY', 
    custom_data=['Col1', 'Col2', 'Col3']
)

然后使用update_traceshovertemplate 对其进行修改,将其引用为customdata。例如:

fig.update_traces(
    hovertemplate="<br>".join([
        "ColX: %x",
        "ColY: %y",
        "Col1: %customdata[0]",
        "Col2: %customdata[1]",
        "Col3: %customdata[2]",
    ])
)

这需要大量的试验和错误才能弄清楚,因为它没有很好的记录,custom_datacustomdata 之间的不一致令人困惑。

【讨论】:

【参考方案2】:

您可以将自定义数据添加到悬停模板:

hovertemplate = 'Price: $%customdata[0]:.2f'+'<br>Week: %customdata[1] ' 
+ '<br>Change: %customdata[2]'

其中customdata 可以是您的group_dfff,甚至可以是您要从中获取悬停信息数据的其他完全不同的数据框。

这是 plotly 文档的link。

【讨论】:

【参考方案3】:

我实际上也遇到过类似的问题,相信我花了 2 个半小时才弄明白。让我们通过一个例子来理解。

fig = make_subplots(rows=1,cols=2,subplot_titles=('First plot','Second plot'),
                   specs=[['type': 'scene', 'type': 'scene']])

fig.add_trace(go.Scatter3d(x=[0,1,2,3],y=[0,1,2,3],z=[0,1,2,3]), row=1,col=1)
fig.add_trace(go.Scatter3d(x=[0,1,2,3],y=[0,1,2,3], z=[0,1,2,3]), row=1,col=2)

fig.update_layout(title='Add Custom Data')

fig.show()

这将创建两个简单的 scatter3d 图,其中 hoverdata 是 x、y 和 z 轴。现在您想将数据 m=[9,8,7,6,5] 添加到第一个绘图中。您可以在 text 参数中解析 m 并添加 hovertemplate

fig.add_trace(go.Scatter3d(x=[0,1,2,3],y=[0,1,2,3],z=[0,1,2,3],
                          text=[9,8,7,6], hovertemplate='<br>x:%x<br>y:%y<br>z:%z<br>m:%text'), row=1,col=1)

这应该可以正常工作。但是现在我们想在第一个图(或任何图)中再添加一个列表,例如 n=[5,6,7,8]。这次我们将使用customdata 参数。

fig.add_trace(go.Scatter3d(x=[0,1,2,3],y=[0,1,2,3],z=[0,1,2,3],
                          text=[9,8,7,6],customdata=[5,6,7,8],
                          hovertemplate='<br>x:%x<br>y:%y<br>z:%z<br>m:%text<br>n:%customdata'), row=1,col=1)

现在,如果我们想添加我们的第三个自定义数据列表怎么办。棘手的部分来了。不能解析自定义数据中两个列表的列表,然后调用customdata[0]customdata[1],没那么简单。我们的第三个列表是k=[2,4,6,8]

我们需要这样的customdata=[[[5],[2]],[[6],[4]],[[7],[6]],[[8],[8]]],它应该可以正常工作。基本上我们需要给出一个单独的列表(或数组),其中每个元素是您要显示的所有点的列表。

fig.add_trace(go.Scatter3d(x=[0,1,2,3],y=[0,1,2,3],z=[0,1,2,3],
                          text=[9,8,7,6],customdata=[[[5],[2]],
                                                     [[6],[4]],
                                                     [[7],[6]],
                                                     [[8],[8]]],
                          hovertemplate='<br>x:%x<br>y:%y<br>z:%z<br>m:%text<br>n:%customdata[0]<br>k:%customdata[1]'), row=1,col=1)

我们几乎完成了,但还剩下一件事。像我们在 customdata 中给出的那样手动创建列表需要做很多工作,因此我们将使用强大的库 import numpy as np 自动化它

n = [5,6,7,8]
k = [2,4,6,8]

nk = np.empty(shape=(4,2,1), dtype='object')
nk[:,0] = np.array(n).reshape(-1,1)
nk[:,1] = np.array(k).reshape(-1,1)
fig.add_trace(go.Scatter3d(x=[0,1,2,3],y=[0,1,2,3],z=[0,1,2,3],
                          text=[9,8,7,6],customdata=nk,
                          hovertemplate='<br>x:%x<br>y:%y<br>z:%z<br>m:%text<br>n:%customdata[0]<br>k:%customdata[1]'), row=1,col=1)

轰! 如果要直接从数据框中添加数据,可以解析 df['Column name'] 代替 np.array(n)

【讨论】:

以上是关于Python/Plotly:如何使用要显示的信息自定义悬停模板?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JS 客户端上正确显示使用 Python Plotly 在服务器上创建的图表?

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

python plotly小提琴图显示负尾

Python Plotly CDF 与频率分布数据

python plotly 使用教程

如何在python plotly scattergeo线图中分离不同的痕迹