You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为多DataFrame绘制的分组水平条形图添加数值标签

为分组水平条形图添加数值标签

我明白你想要给每个水平条形添加对应的数值标签,让图表信息更直观清晰。咱们可以通过遍历每个坐标轴上的条形对象(patches),在每个条形的合适位置添加文本标签来实现。下面是修改后的完整代码,已经帮你集成了标签功能:

import pandas as pd
import matplotlib.pyplot as plt

data1 = { 'age': ['20-24 Years', '25-29 Years', '30-34 Years', '35-39 Years', '40-44 Years', '45-49 Years'], 'single_value': [97, 75, 35, 19, 15, 13] }
data2 = { 'age': ['20-24 Years', '25-29 Years', '30-34 Years', '35-39 Years', '40-44 Years', '45-49 Years'], 'single_value': [98, 79, 38, 16, 15, 13] }
data3 = { 'age': ['20-24 Years', '25-29 Years', '30-34 Years', '35-39 Years', '40-44 Years', '45-49 Years'], 'single_value': [89, 52, 22, 16, 12, 13] }
data4 = { 'age': ['20-24 Years', '25-29 Years', '30-34 Years', '35-39 Years', '40-44 Years', '45-49 Years'], 'single_value': [95, 64, 27, 18, 15, 13] }

df_male_1 = pd.DataFrame(data1)
df_male_2 = pd.DataFrame(data2)
df_female_1 = pd.DataFrame(data3)
df_female_2 = pd.DataFrame(data4)

fig, axes = plt.subplots(ncols=2, sharey=True, figsize=(12,6))

# 绘制男性组条形图并保存条形对象
bar1_male = axes[0].barh(df_male_1['age'], df_male_1['single_value'], align='edge', height=0.3, color='lightskyblue', zorder=10)
bar2_male = axes[0].barh(df_male_2['age'], df_male_2['single_value'], align='edge', height=-0.3, color='royalblue', zorder=10)
axes[0].set(title='Age Group (Male)')

# 给男性组条形添加标签(左侧轴X反向,标签放条形左侧)
for bar in bar1_male:
    width = bar.get_width()
    axes[0].text(width - 3, bar.get_y() + bar.get_height()/2,
                 f'{int(width)}', va='center', fontsize=10)
for bar in bar2_male:
    width = bar.get_width()
    axes[0].text(width - 3, bar.get_y() + bar.get_height()/2,
                 f'{int(width)}', va='center', fontsize=10)

# 绘制女性组条形图并保存条形对象
bar1_female = axes[1].barh(df_female_1['age'], df_female_1['single_value'], align='edge',height=0.3,color='navajowhite', zorder=10)
bar2_female = axes[1].barh(df_female_2['age'], df_female_2['single_value'], align='edge', height=-0.3,color='darkorange', zorder=10)
axes[1].set(title='Age Group (Female)')

# 给女性组条形添加标签(右侧轴X正向,标签放条形右侧)
for bar in bar1_female:
    width = bar.get_width()
    axes[1].text(width + 1, bar.get_y() + bar.get_height()/2,
                 f'{int(width)}', va='center', fontsize=10)
for bar in bar2_female:
    width = bar.get_width()
    axes[1].text(width + 1, bar.get_y() + bar.get_height()/2,
                 f'{int(width)}', va='center', fontsize=10)

axes[0].invert_xaxis()
axes[0].set(yticks=df_male_1['age'])
axes[0].yaxis.tick_right()

for ax in axes.flat:
    ax.margins(0.03)
    ax.grid(True)

fig.tight_layout()
fig.subplots_adjust(wspace=0.185, top=0.88)
plt.show()

关键细节说明:

  • 我把每个barh的返回值(条形对象集合)存了下来,这样就能逐个遍历处理每个条形。
  • 左侧男性轴的X轴是反向的,所以标签要放在条形的左侧(用width - 3调整位置,避免和条形重叠);右侧女性轴的标签放在条形右侧(用width + 1)。
  • bar.get_y() + bar.get_height()/2配合va='center',让标签垂直居中对齐条形,视觉上更协调。
  • 用f'{int(width)}'把数值转成整数显示,让标签更简洁干净。

你可以根据自己的需求调整标签的位置偏移量、字体大小等参数,让图表的视觉效果更符合预期。

内容的提问来源于stack exchange,提问作者Issaki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:27:23