打印堆叠条形图文本注释问题

2024-05-16 11:38:23 发布

您现在位置:Python中文网/ 问答频道 /正文

所以,我有这个简化的数据框,我使用plotly.graph_objects来绘制一个带有文本注释的堆叠条形图。 我从薪水栏中得到了我想要的文本,但在年龄栏中,我无法得到相同的文本,因为年龄栏的值要低得多。我希望这些注释大小相同,并且位于每个条的顶部。 如何使文本注释在“年龄”列中也可见

请在下面找到我的代码:

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")

enter image description here

提前谢谢


Tags: textname文本godfnewagedata
1条回答
网友
1楼 · 发布于 2024-05-16 11:38:23

我认为你必须从两种可能的解决方案中进行选择。首先,通过使用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")

相关问题 更多 >