【问题标题】:Plotly Stacked Bar Chart text annotation issuePlotly Stacked Bar Chart 文本注释问题
【发布时间】:2021-06-25 09:39:19
【问题描述】:

所以,我有这个简化的数据框,我正在使用plotly.graph_objects 绘制带有文本注释的堆叠条形图。 我从 Salary 列中获得了我想要的文本,但对于值明显较低的 Age 列,我无法获得相同的文本。我希望这些注释具有相同的大小并位于每个条的顶部。 如何让 Age 列的文本注释也可见?

请在下面找到我的代码:

data = {'Name':['Tom', 'Nick', 'Jack'],
        'Age':[18, 21, 19],
        'Salary':[500, 700, 900]}
df_new=pd.DataFrame(data)

fig = go.Figure(go.Bar(x = df_new["Name"],
                       y = df_new["Age"],name='Age',text=df_new["Age"],
                       textposition='outside'))
fig.add_bar(x = df_new["Name"],
            y = df_new["Salary"],name='Salary',text=df_new["Salary"],
            textposition='outside')
fig.update_layout(barmode='stack',
                  title = 'Age - Salary',
                  xaxis_title="Name",
                  yaxis_title="Age / Salary")

提前致谢!

【问题讨论】:

    标签: python plotly stacked-chart


    【解决方案1】:

    我认为您必须从 2 种可能的解决方案中进行选择。首先,通过使用barmode = stack 参数,您正在堆叠并因此对年龄和薪水的值求和。条的高度将为age + salary,因此汤姆的条的高度将为500 + 18 = 518。我建议不要这样做,因为我认为高度应该反映标注值。


    解决方案 1 - 分组条形

    此解决方案基于将 barmode 更改为 barmode = group。这将创建两个独立的条形图,它们有自己的标注和反映其值的高度。 我还添加了width 参数来制作更漂亮的纵横比。

    fig = go.Figure()
    fig.add_bar(x = df_new["Name"],
                y = df_new["Age"],name='Age',text=df_new["Age"],
                width = [0.3]*len(df_new),
                )
    
    fig.add_bar(x = df_new["Name"],
                y = df_new["Salary"],name='Salary',text=df_new["Salary"],
                width = [0.3]*len(df_new)
                )
    fig.update_layout(barmode='group',
                      title = 'Age - Salary',
                      xaxis_title="Name",
                      yaxis_title="Age / Salary"
                      )
    fig.update_traces(
        textposition='outside'
    )
    fig.update_yaxes(range=[0,1000])
    

    解决方案 2 - 添加辅助 y 轴

    我更喜欢这个解决方案,因为这两个类别的相对大小可以分别缩放到自己的域;这使图表更具可读性。这使用make_subplots 创建两个轴和secondary_y 参数。我通过调整轴的宽度和范围使两个条都可见。

    根据您必须根据自己的喜好手动重新调整的数据。您还可以将opacity 合并为透视栏,但您仍然有重叠数据标注的风险。

    from plotly.subplots import make_subplots
    
    fig = make_subplots(specs=[[{"secondary_y": True}]])
    fig.add_bar(
        x=df_new["Name"],
        y=df_new["Age"],
        name="Age",
        text=df_new["Age"],
        width=[0.3] * len(df_new),
        secondary_y=True,
        textposition="outside"
    )
    fig.add_bar(
        x=df_new["Name"],
        y=df_new["Salary"],
        name="Salary",
        text=df_new["Salary"],
        width=[0.5] * len(df_new),
        secondary_y=False,
        textposition="outside"
    )
    
    fig.update_yaxes(range=[0, 1000], title='Salary', secondary_y=False)
    fig.update_yaxes(range=[0, 45], title='Age', secondary_y=True)
    fig.update_layout(title="Age and Salary", xaxis_title="Name")
    

    【讨论】:

    • 非常感谢@Seth 提供了非常全面的答案。我更喜欢解决方案 2。虽然我已经使用了辅助 y 轴,但我不记得在这种情况下使用它。不透明度也是一个不错的选择。
    猜你喜欢
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多