将单个标签嵌入到 plotly express 直方图中

Posted

技术标签:

【中文标题】将单个标签嵌入到 plotly express 直方图中【英文标题】:Embedding individual label into plotly express histogram 【发布时间】:2021-12-17 14:09:27 【问题描述】:

我想将单个标签嵌入到 plotly express 直方图的每个条形中。

举个例子:

import plotly.express as px
import pandas as pd
    
df = pd.DataFrame('name':['label1', 'label2','label3', 'label4', 'label1'],
                   'val1':[1,2,1,2,1])

px.histogram(df, x='val1', nbins=3)

是否可以让['label1', 'label3']['label2', 'label4'] 分别出现在直方图的第 1 列和第 2 列?

【问题讨论】:

【参考方案1】: 也可以在 pandas 中计算数据 在图上添加附加信息作为注释
import plotly.express as px
import pandas as pd
    
df = pd.DataFrame('name':['label1', 'label2','label3', 'label4', 'label1'],
                   'val1':[1,2,1,2,1])

fig = px.histogram(df, x='val1', nbins=3)

# work out bins in pandas...
df2 = (
    df.groupby(pd.cut(df["val1"], bins=3))
    .agg(
        count=("name", "size"),
        labels=("name", lambda s: ",".join(s.drop_duplicates().tolist())),
    )
    .assign(
        l=lambda d: [i.left for i in d.index.values],
        r=lambda d: [i.right for i in d.index.values],
        x=lambda d: [(i.left+i.right)/2 for i in d.index.values],
        count=lambda d: d["count"].astype(float)
    )
).fillna("")

# add text to histogram
for r in df2.iterrows():
    fig.add_annotation(text=r[1]["labels"], x=(r[1]["l"]+r[1]["r"])/2, y=r[1]["count"]+.2, showarrow=False)

fig

【讨论】:

非常感谢您的解决方案 Rob。非常感激!然而,我简化了这个问题,因为我的数据集在 Val1 中有更多的类,并且每个类中还有许多对单个 labels 的详细描述。所以更准确地说,我想看看当鼠标悬停在每个条上时,前 10 个标签是否会以交互方式出现。 很简单 - 只有 5 个标签:labels=("name", lambda s: ",".join(s.drop_duplicates().tolist()[0:5])) 如果你想构建为悬停,我会去更改为 px.bar 而不是直方图。您在 df2 中拥有生成简单条形图所需的一切

以上是关于将单个标签嵌入到 plotly express 直方图中的主要内容,如果未能解决你的问题,请参考以下文章

Plotly:如何在 plotly express 折线图中更改图例的变量/标签名称?

Plotly:如何使用 plotly express 自定义 xaxis 刻度标签?

Plotly Express:处理子图

如何将带有 plotly 的 ggplot 嵌入到 r 闪亮的应用程序或 flexdashboard 中?

使用 Bottle 将 Plotly 图嵌入网页

Plotly 时间线可以在 Jupyter Notebook Widget 中使用/复制吗?