Plotly express 箱线图悬停数据不起作用

Posted

技术标签:

【中文标题】Plotly express 箱线图悬停数据不起作用【英文标题】:Plotly express box plot hover data not working 【发布时间】:2022-01-03 21:27:12 【问题描述】:

尝试在 plotly 中将数据添加到 boxplot express 的悬停中,并按照 plotly 5.4.1 中的说明here。教程中提到可以通过hover_datahover_name 参数添加要在悬停中显示的附加信息。但是,附加悬停数据(在这种情况下来自continent 列的信息)不会显示在悬停中。我不确定这里出了什么问题? (这是我在 Google colab 中测试的代码)

import plotly.express as px
import pandas as pd
import numpy as np
np.random.seed(1234)

df = pd.DataFrame(np.random.randn(20, 1),columns=['Col1'])
df['country']=['canada','france']*10
df['continent']=['america','europe']*10

fig = px.box(df, x="country", y="Col1",  hover_data=['continent'])

fig.show()

这是我在 google colab 中得到的:

使用建议的解决方案时出现错误(已通过 pip install plotly --upgrade 解决):

@Rob 提供的解决方案有效,但为了使其成为通用函数,这是我写出来的:

def box_with_hover(df,x,y,hover_data):    
  fig = px.box(df, x=x, y=y, hover_data=[hover_data])

  fig.add_traces(
      px.bar(
          df.groupby([x, hover_data], as_index=False).agg(
              base=(y, "min"), y=(y, lambda s: s.max() - s.min())
          ),
          x=x,
          base="base",
          y="y",
          hover_data=hover_data:True, x:True, "base":False, "y":False,
      )
      .update_traces(opacity=0.1)
      .data   ).update_layout(bargap=0.8)


  fig.show()

【问题讨论】:

我不确定是什么问题。当您将鼠标悬停在框上时,它将显示数据。 @morhc,显示大陆数据?!你在谷歌colab上测试它吗?你能分享屏幕截图吗?谢谢 这与您在屏幕截图中的结果相同。这不是您想要的数据吗?如果是,请澄清问题。 【参考方案1】: 这类似于Change Plotly Boxplot Hover Data boxplot 悬停信息位于 plotlyjavascript 层中。因此覆盖了一个 bar 图,可以按照您需要的方式控制悬停。当您将鼠标悬停在 boxplot 上时,您将获得标准的 boxplot 悬停。 不同的悬停信息
import plotly.express as px
import pandas as pd
import numpy as np

np.random.seed(1234)

df = pd.DataFrame(np.random.randn(20, 1), columns=["Col1"])
df["country"] = ["canada", "france"] * 10
df["continent"] = ["america", "europe"] * 10

fig = px.box(df, x="country", y="Col1", hover_data=["continent"])

fig.add_traces(
    px.bar(
        df.groupby(["country", "continent"], as_index=False).agg(
            base=("Col1", "min"), y=("Col1", lambda s: s.max() - s.min())
        ),
        x="country",
        base="base",
        y="y",
        hover_data="continent":True, "country":True, "base":False, "y":False,
    )
    .update_traces(opacity=0.1)
    .data
).update_layout(bargap=0.8)


fig

通用函数

import plotly.express as px
import pandas as pd
import numpy as np

np.random.seed(1234)

df = pd.DataFrame(np.random.randn(20, 1), columns=["Col1"])
df["country"] = ["canada", "france"] * 10
df["continent"] = ["america", "europe"] * 10
df["letter"] = list("AB") * 10


def box_with_hover(*args, **kwargs):
    if isinstance(args[0], pd.DataFrame):
        kwargs["data_frame"] = args[0]
    fig = px.box(**kwargs)

    fig.add_traces(
        px.bar(
            kwargs["data_frame"]
            .groupby([kwargs["x"]], as_index=False)
            .agg(
                **
                    **
                        "base": (kwargs["y"], "min"),
                        "y": (kwargs["y"], lambda s: s.max() - s.min()),
                    ,
                    **c: (c, "first") for c in kwargs["hover_data"],
                
            ),
            x=kwargs["x"],
            base="base",
            y="y",
            hover_data=
                **c: True for c in kwargs["hover_data"],
                **kwargs["x"]: True, "base": False, "y": False,
            ,
        )
        .update_traces(opacity=0.1)
        .data
    ).update_layout(bargap=0.8)
    return fig


box_with_hover(
    df.reset_index(), x="country", y="Col1", hover_data=["continent", "letter", "index"]
)

【讨论】:

谢谢@rob。我得到这个解决方案的错误 bar() got an unexpected keyword argument 'base' 我正在使用 plotly 5.4.0,pandas 1.3.4。您是否使用我输入的确切代码得到了该错误? df.groupby(["country", "continent"], as_index=False).agg( base=("Col1", "min"), y=("Col1", lambda s: s.max() - s.min()) ) 这行得通吗?我怀疑命名聚合的熊猫版本问题 我在 google colab 中更新了 plotly 和 pandas 版本:pip install plotly==5.4.0 和 pip install pandas==1.3.4。我在问题中添加了错误图。 你可以在 google colab 中检查这个吗? 它在 Colab 中工作,只需要先运行pip install plotly --upgrade 并重新启动运行时

以上是关于Plotly express 箱线图悬停数据不起作用的主要内容,如果未能解决你的问题,请参考以下文章

使用 Plotly Graph 对象按中值对箱线图进行排序

Plotly - 如何制作没有盒子的箱线图?

如何在plotly中跨子图对齐分组箱线图

在 plotly 中显式设置箱线图的颜色

如何使用 plotly express 创建线图,其中可以通过下拉菜单选择 pandas 数据框?

如何获得带有垂直子图的分组箱线图