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 个等元素执行此操作。
非常感谢您的帮助!
【问题讨论】:
所以我为这个特定的场景找出了我的问题......我必须添加'<br>%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_traces
和hovertemplate
对其进行修改,将其引用为customdata
。例如:
fig.update_traces(
hovertemplate="<br>".join([
"ColX: %x",
"ColY: %y",
"Col1: %customdata[0]",
"Col2: %customdata[1]",
"Col3: %customdata[2]",
])
)
这需要大量的试验和错误才能弄清楚,因为它没有很好的记录,custom_data
和 customdata
之间的不一致令人困惑。
【讨论】:
【参考方案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:如何使用要显示的信息自定义悬停模板?的主要内容,如果未能解决你的问题,请参考以下文章