【问题标题】:Adding percentage of count to a stacked bar chart in plotly在绘图中将计数百分比添加到堆积条形图
【发布时间】:2020-12-10 10:50:27
【问题描述】:

鉴于以下图表是在 plotly 中创建的。

我想在每个块内添加 M 和 F 类别的每个计数的百分比值。

用于生成此图的代码。

arr = np.array([
        ['Dog', 'M'], ['Dog', 'M'], ['Dog', 'F'], ['Dog', 'F'],
        ['Cat', 'F'], ['Cat', 'F'], ['Cat', 'F'], ['Cat', 'M'],
        ['Fox', 'M'], ['Fox', 'M'], ['Fox', 'M'], ['Fox', 'F'],
        ['Dog', 'F'], ['Dog', 'F'], ['Cat', 'F'], ['Dog', 'M']
    ])

df = pd.DataFrame(arr, columns=['A', 'G'])

fig = px.histogram(df, x="A", color='G', barmode="stack")
fig.update_layout(height=400, width=800)

fig.show()

【问题讨论】:

    标签: python plotly data-visualization plotly-dash plotly-python


    【解决方案1】:

    据我所知,Plotly 中的直方图没有文本属性。但是您可以自己生成条形图,然后通过 text 属性添加百分比。

    import numpy as np
    import pandas as pd
    import plotly.express as px
    
    arr = np.array([
            ['Dog', 'M'], ['Dog', 'M'], ['Dog', 'F'], ['Dog', 'F'],
            ['Cat', 'F'], ['Cat', 'F'], ['Cat', 'F'], ['Cat', 'M'],
            ['Fox', 'M'], ['Fox', 'M'], ['Fox', 'M'], ['Fox', 'F'],
            ['Dog', 'F'], ['Dog', 'F'], ['Cat', 'F'], ['Dog', 'M']
        ])
    
    df = pd.DataFrame(arr, columns=['A', 'G'])
    
    df_g = df.groupby(['A', 'G']).size().reset_index()
    df_g['percentage'] = df.groupby(['A', 'G']).size().groupby(level=0).apply(lambda x: 100 * x / float(x.sum())).values
    df_g.columns = ['A', 'G', 'Counts', 'Percentage']
    
    px.bar(df_g, x='A', y=['Counts'], color='G', text=df_g['Percentage'].apply(lambda x: '{0:1.2f}%'.format(x)))
    

    【讨论】:

    • 代码看起来不错,只是对我来说最后一行必须更改为: px.bar(df_g, x='A', y='Counts', color='G', text=df_g['Percentage'].apply(lambda x: '{0:1.2f}%'.format(x)))
    【解决方案2】:

    请注意,您现在可以指定 barnormtext_auto 参数来实现此目的。看看你的例子:

    # Libraries
    import numpy as np
    import pandas as pd
    import plotly.express as px
    
    # Data
    arr = np.array([
        ['Dog', 'M'], ['Dog', 'M'], ['Dog', 'F'], ['Dog', 'F'],
        ['Cat', 'F'], ['Cat', 'F'], ['Cat', 'F'], ['Cat', 'M'],
        ['Fox', 'M'], ['Fox', 'M'], ['Fox', 'M'], ['Fox', 'F'],
        ['Dog', 'F'], ['Dog', 'F'], ['Cat', 'F'], ['Dog', 'M']
    ])
    
    df = pd.DataFrame(arr, columns=['A', 'G'])
    
    #Plotly Code
    fig = go.Figure()
    
    fig = px.histogram (  df,
                          x="A",
                          color="G",
                          barnorm = "percent",
                          text_auto= True,
                          color_discrete_sequence=["mediumvioletred", "seagreen"],
                    ) \
            .update_layout (
    
                        title={
                                "text": "Percent :A - G",
                                "x": 0.5
                              },
    
                        yaxis_title="Percent"
                    ) \
            .update_xaxes(categoryorder='total descending')
    
    fig.show()
    

    一般来说,与自己计算百分比相比,它应该是首选的解决方案。这里的输出:

    【讨论】:

    • TypeError: histogram() got an unexpected keyword argument 'text_auto'
    • 确保你的 plotly 安装有最新的更新。
    • 从 plotly 5.4 升级到 5.6 允许我使用 'text_auto'
    • 这应该是 2022 年 3 月的公认答案。
    猜你喜欢
    • 2017-11-27
    • 2018-06-04
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多