如何在Pandas绘制的条形图上方显示对应字典数值?
解决条形图顶部显示对应数值的问题
核心问题分析
你遇到的两个问题根源在于:
- 未保证
counter_dct的顺序与排序后的条形图一致 plt.text的坐标参数使用错误(x/y顺序搞反,且未基于条形高度定位)
最优实现代码
import pandas as pd import matplotlib.pyplot as plt import matplotlib as mpl mpl.rcParams['axes.formatter.useoffset'] = False # 定义原始字典 population_dct = {'pak': 210, 'afg': 182, 'ban': 94, 'ind': 32, 'aus': 14, 'usa': 345, 'nz': 571, 'col': 47, 'iran': 2} counter_dct = {'pak': 1.12134, 'afg': 32.4522, 'ban': 3.44, 'ind': 1.123, 'aus': 4.22, 'usa': 9.44343, 'nz': 57.12121, 'col': 2.447, 'iran': 27.5} # 合并为DataFrame,确保国家与两个数值一一对应 df = pd.DataFrame({ 'population': population_dct, 'counter': counter_dct }) # 按population降序排序,与条形图顺序完全匹配 df_sorted = df.sort_values('population', ascending=False) # 绘制条形图并获取轴对象 ax = df_sorted['population'].plot.bar(color='g') # 遍历每个条形,添加顶部文本 for idx, (pop_value, counter_value) in enumerate(zip(df_sorted['population'], df_sorted['counter'])): # 文本位置:条形x坐标为idx,y坐标为条形高度+偏移量(避免重叠) # 水平居中,垂直底部对齐,保证文本在条形顶部 ax.text( x=idx, y=pop_value + 10, s=f'{counter_value:.2f}', # 保留两位小数优化显示 ha='center', va='bottom', color='blue', fontweight='bold' ) # 调整y轴上限,防止顶部文本被截断 ax.set_ylim(0, df_sorted['population'].max() + 30) plt.savefig("temp_fig.png") plt.show()
关键改进点
- 顺序匹配:通过将两个字典合并到同一DataFrame并按
population排序,确保counter值的顺序与条形图完全对应,彻底解决顺序错位问题。 - 文本定位:
- 使用条形的索引
idx作为x坐标,保证每个文本对应正确的条形 - 以条形高度
pop_value为基础,加上固定偏移量作为y坐标,让文本显示在条形顶部 - 通过
ha='center'和va='bottom'实现文本在条形顶部居中对齐,解决位置混乱问题
- 使用条形的索引
- 显示优化:对
counter值保留两位小数,调整y轴范围避免文本被截断,提升图表可读性
内容的提问来源于stack exchange,提问作者Jlow
相关产品推荐
相关产品推荐

