【问题标题】:Embedding individual label into plotly express histogram将单个标签嵌入到 plotly express 直方图中
【发布时间】: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 列?

【问题讨论】:

    标签: plotly histogram plotly-python plotly-express


    【解决方案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 中拥有生成简单条形图所需的一切
    猜你喜欢
    • 2020-01-19
    • 2015-01-24
    • 1970-01-01
    • 2020-01-29
    • 2021-09-24
    • 2021-08-29
    • 2021-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多