【问题标题】:Python/Plotly: How to customize hover-template on with what information to show?Python/Plotly:如何使用要显示的信息自定义悬停模板?
【发布时间】: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 是一个内置的东西,所以我仍然不确定如何添加让我们说第四个,我希望在悬停数据点时拥有的第五个和更多标签......跨度>

标签: python plot hover dataset plotly


【解决方案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)

      【讨论】:

        猜你喜欢
        • 2020-12-18
        • 2018-05-10
        • 2020-12-10
        • 1970-01-01
        • 2013-11-05
        • 2018-01-29
        • 2022-01-13
        • 1970-01-01
        • 2016-07-12
        相关资源
        最近更新 更多