如何为多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
相关产品推荐
相关产品推荐

