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

DGo*_*nov 6 python plot dataset hover plotly

这是我的数据集:

我的演示数据集

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

打印 3 dfs

现在对于我的 Plotly 绘图,我使用它来显示跟踪并添加一些悬停信息:

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

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

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

所需的悬停模板输出

我解决了我的具体问题,请查看下面的图片(添加第 3 个元素,请参阅评论),但是问题仍然相同,因为我不知道如何为第 4 个、第 5 个等元素执行此操作。 在此处输入图片说明

非常感谢帮助!

小智 21

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

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

然后使用update_tracesand修改它hovertemplate,将其引用为customdata. 例如:

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

这花了大量的试验和错误的搞清楚,因为它是不充分证明,以及之间的矛盾custom_datacustomdata令人困惑。


Adi*_*gor 16

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

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()
Run Code Online (Sandbox Code Playgroud)

这将创建两个简单的 scatter3d 图,其中悬停数据是 x、y 和 z 轴。现在您想要将数据添加m=[9,8,7,6,5]到第一个图中。您也可以解析m参数text并添加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)
Run Code Online (Sandbox Code Playgroud)

这应该可以正常工作。但现在我们想添加一个列表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)
Run Code Online (Sandbox Code Playgroud)

现在,如果我们想添加第三个自定义数据列表该怎么办?棘手的部分来了。不能解析自定义数据中两个列表的列表,然后调用customdata[0]and 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)
Run Code Online (Sandbox Code Playgroud)

我们快完成了,但还剩下一件事。像我们在自定义数据中给出的那样手动创建列表需要大量工作,因此我们将使用强大的库将其自动化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)
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)

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


Sar*_*ser 9

与上面类似,但我更喜欢一次性执行所有命令,始终使用 DataFrame,并坚持使用 Plotly 而不是 Plotly Express:

fig.add_trace(
    go.Scatter(
        x=group_dfff.Months,
        y=group_dfff.Amount,
        customdata=group_dfff.PERC_CHANGE,
        name=i,
        hovertemplate='<br>'.join([
            'Price: $%{y:.2f}',
            'Week: %{x}',
            'Percent Change: %{customdata}',
        ]),
    )
)
Run Code Online (Sandbox Code Playgroud)

另请注意,如果您的 DataFrame 中有多个“自定义数据”字段(例如“A”和“B”),您希望将其包含在悬停数据中,则可以稍微修改上面的内容以包含尽可能多的数据喜欢:

fig.add_trace(
    go.Scatter(
        x=group_dfff.Months,
        y=group_dfff.Amount,
        customdata=group_dfff[['A', 'B']],
        name=i,
        hovertemplate='<br>'.join([
            'Price: $%{y:.2f}',
            'Week: %{x}',
            'Field A: %{customdata[0]}',
            'Field B: %{customdata[1]}',
        ]),
    )
)
Run Code Online (Sandbox Code Playgroud)


sig*_*eta 5

您可以将自定义数据添加到悬停模板,如下所示:

hovertemplate = 'Price: $%{customdata[0]:.2f}'+'<br>Week: %{customdata[1]} ' 
+ '<br>Change: %{customdata[2]}'
Run Code Online (Sandbox Code Playgroud)

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

这是plotly 文档的链接。