如何在pandas水平条形图末端显示所有数值(含小数值)
解决pandas水平条形图末端小数值无法显示的问题
我之前也碰到过一模一样的情况——用pd.value_counts()直接生成的水平条形图,小数值经常因为条形太短被“藏”起来,根本看不到。其实不用纠结有没有明确的X/Y轴数据,我们可以直接操作pandas绘图后生成的条形元素,给每个条形都加上数值标注就行。
给你修改好的可直接运行的代码:
import matplotlib.pyplot as plt import pandas as pd fig = plt.figure(figsize=(20,15)) # 处理第一个子图 axis1 = fig.add_subplot(211) axis1.set_title("Title name") # 先统计数据,再指定ax参数绑定到子图,不用多余的赋值操作 counts1 = pd.value_counts(df['column5']).sort_values() counts1.plot(kind='barh', ax=axis1) # 遍历每个条形添加数值标注 for bar in axis1.patches: # 获取条形宽度(也就是统计的数值大小) bar_width = bar.get_width() # 计算文本垂直居中的Y坐标,让标注看起来更整齐 y_center = bar.get_y() + bar.get_height() / 2 # 在条形末端添加文本,左对齐确保小数值也能完整显示 axis1.text(bar_width, y_center, f'{bar_width:.2f}', ha='left', va='center') # 处理第二个子图,逻辑和第一个完全一致 axis2 = fig.add_subplot(212) axis2.set_title("Title name2") counts2 = pd.value_counts(df['column6']).sort_values() counts2.plot(kind='barh', ax=axis2) for bar in axis2.patches: bar_width = bar.get_width() y_center = bar.get_y() + bar.get_height() / 2 axis2.text(bar_width, y_center, f'{bar_width:.2f}', ha='left', va='center') # 自动调整布局,避免标题和图表重叠挤在一起 fig.tight_layout() fig.savefig('report.pdf')
几个关键细节补充:
- 别把
plot()的结果赋值给axis1.plot,这是完全多余的操作,直接用ax参数把绘图绑定到指定子图轴上就好 axis.patches会返回所有条形的元素集合,我们可以逐个遍历处理每个条形- 如果你不需要保留两位小数,可以把
f'{bar_width:.2f}'改成f'{bar_width}'显示整数,或者调整成你需要的小数位数 fig.tight_layout()能自动优化子图间距,让整体排版更舒服,不会出现标题压到图表的情况
内容的提问来源于stack exchange,提问作者Svan
相关产品推荐
相关产品推荐

