【问题标题】:Plotly graph_objects add df column to hovertemplatePlotly graph_objects 将 df 列添加到 hovertemplate
【发布时间】:2020-07-09 23:17:43
【问题描述】:

我一般都在尝试recreate this 图表,并努力在情节分散的悬停模板中添加一列。这是一个工作示例:

import pandas as pd
import chart_studio.plotly as py
import plotly.graph_objects as go

dfs = pd.read_html('https://coronavirus.jhu.edu/data/mortality', header=0)
df = dfs[0]
percent = df['Case-Fatality'] # This is my closest guess, but isn't working
fig = go.Figure(data=go.Scatter(x=df['Confirmed'],
                               y = df['Deaths'],
                               mode='markers',
                               hovertext=df['Country'],
                               hoverlabel=dict(namelength=0),
                               hovertemplate = '%{hovertext}<br>Confirmed: %{x}<br>Fatalities: %{y}<br>%{percent}',
                               
                               ))
fig.show()

我想让Cast-Fatality 列显示在{percent}

我还尝试在Scatter() 中为text = [df['Case-Fatality']], 调用一行并将{percent} 切换为{text},如this example 中所示,但这并没有像希望的那样从数据帧中提取。

我尝试将其重新绘制为px,跟随this example,但它会引发错误dictionary changed size during iteration,我认为使用go 可能比px 更简单,但我是plotly 的新手。

提前感谢您提供有关如何向悬停添加列的任何见解。

【问题讨论】:

  • 如果您收到的建议有用,请考虑点赞和/或将其标记为已接受的答案!
  • 我愿意,但我要等一天才能接受我的有效答案。
  • 帮助您构建自己的解决方案的答案的投票按钮仍然有效,对吧?

标签: python plotly


【解决方案1】:

由于问题要求graph_objects 的解决方案,这里有两个可行-

方法(一)

在您希望变量值所在的位置添加%{text},并传递另一个名为text 的变量,它是go.Scatter() 调用中所需值的列表。像这样-

percent = df['Case-Fatality']
hovertemplate = '%{hovertext}<br>Confirmed: %{x}<br>Fatalities: %{y}<br>%{text}',text = percent

这是完整的代码-

import pandas as pd
import plotly.graph_objects as go

dfs = pd.read_html('https://coronavirus.jhu.edu/data/mortality', header=0)
df = dfs[0]
percent = df['Case-Fatality'] # This is my closest guess, but isn't working
fig = go.Figure(data=go.Scatter(x=df['Confirmed'],
                               y = df['Deaths'],
                               mode='markers',
                               hovertext=df['Country'],
                               hoverlabel=dict(namelength=0),
                               hovertemplate = '%{hovertext}<br>Confirmed: %{x}<br>Fatalities: %{y}<br>%{text}',
                               text = percent))
fig.show()

方法(ii)

此解决方案要求您在将x unified 传递给hovermode 时看到悬停标签。然后,您需要做的就是传递一条具有相同 x 轴和所需 y 轴值的不可见迹线。传递mode='none' 使其不可见。这是完整的代码-

import pandas as pd
import plotly.graph_objects as go

dfs = pd.read_html('https://coronavirus.jhu.edu/data/mortality', header=0)
df = dfs[0]
percent = df['Case-Fatality'] # This is my closest guess, but isn't working
fig = go.Figure(data=go.Scatter(x=df['Confirmed'],
                               y = df['Deaths'],
                               mode='markers',
                               hovertext=df['Country'],
                               hoverlabel=dict(namelength=0)))
fig.add_scatter(x=df.Confirmed, y=percent, mode='none')
fig.update_layout(hovermode='x unified')
fig.show()

【讨论】:

    【解决方案2】:

    您分享的链接已损坏。你在寻找这样的东西吗?

    import pandas as pd
    import plotly.express as px
    
    px.scatter(df,
               x="Confirmed",
               y="Deaths",
               hover_name="Country",
               hover_data={"Case-Fatality":True})
    

    如果您需要使用粗体或更改您的hover_template,您可以按照此answer 中的最后一步进行操作

    【讨论】:

    • 1.抱歉,我在我的问题中找不到损坏的链接。有两个,它们都在我的最后工作。 2. 感谢您提供代码,但它产生了与我上面描述的相同的错误dictionary changed size during iteration
    • 您使用的是哪个版本的 plotly?请添加plotly.__version__的输出
    • 断开的链接是这个https://coronavirus.jhu.edu/data/mortality。但现在它正在工作。您介意指定要重新创建的情节吗?
    • 从您的回答中提取一点,从另一个问题的答案中提取一点,我已经找到了解决方案。感谢您的贡献。
    • 为了学习,我仍然很想了解如何通过 go 使用 hovertemplate 来实现这一点,但我会继续探索。
    【解决方案3】:

    从另一个 SO question/answer 中汲取灵感,我发现这可以按预期工作,并允许向悬停数据添加多个列:

    import pandas as pd
    import plotly.express as px
    
    fig = px.scatter(df,
               x="Confirmed",
               y="Deaths",
               hover_name="Country",
               hover_data=[df['Case-Fatality'], df['Deaths/100K pop.']])
    fig.show()
    

    【讨论】:

    • 对不起,我不明白。在您问题的任何部分中,您都要求添加“死亡/100K 流行音乐”。这可以很容易地在我的回答中添加hover_data={"Case-Fatality":True, 'Deaths/100K pop.':True}
    • 很抱歉,如果有不清楚的地方。 Deaths/100K pop. 的添加是我发现的,不是最初问题的一部分。但是,我偶然发现的解决方案说明了如何包含多个字段,因此我将其作为补充提到。此外,hover_data={"Case-Fatality":True}hover_data={"Case-Fatality":True, 'Deaths/100K pop.':True} 方法都返回我在问题中提到的错误以及dictionary changed size during iteration 下面的 cmets。我不确定为什么这些数据会产生该错误,因为我看到您的建议遵循 px 文档。
    • 你检查你的plotly.__version__了吗?因为我无法重现您的错误。
    • from plotly import __version__ 然后print(__version__) 返回4.4.1
    • 最新版本是4.8.1 我猜如果你更新你的包你会摆脱错误。另外来自 4.7.0 的 plotly 获得了重要的加速提升。
    猜你喜欢
    • 2021-12-16
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多