Python绘制缺失值占比柱状图时顶部数值标注错位问题排查
问题原因
标注坐标和实际柱子的坐标不匹配是错位的核心原因:
- 循环中使用的
i是遍历per_B所有列的全局索引,包含了缺失占比为0、没有被绘制柱子的列 - matplotlib绘制分类柱状图时,第一个实际绘制的柱子x坐标默认是0,后续依次加1,和全局索引
i没有关联 - 随着遍历的列数增加,全局索引
i和实际柱子的x坐标偏差越来越大,就出现了最后两列标注严重错位的问题
修复方案
推荐先过滤掉缺失占比为0的列再遍历绘制,这样枚举的索引就和实际柱子的x坐标完全对应,修改后代码如下:
import matplotlib.pyplot as plt import numpy as np # 先过滤出缺失占比大于0的列 per_B_filtered = per_B[per_B > 0] f, ax = plt.subplots(figsize=(20, 15)) # 遍历过滤后的序列,此时i就是实际柱子的x坐标索引 for i, (col_name, nan_percent) in enumerate(per_B_filtered.items()): ax.bar(col_name, nan_percent, label=col_name) # 直接用i计算标注位置,不需要考虑被过滤的列 ax.text(i - 0.4, nan_percent + 0.5, str(np.round(nan_percent, 2))) ax.set_xticklabels([]) ax.set_xticks([]) plt.title('NaN Value percentage in Training Set B') plt.ylim(0,115) plt.ylabel('Percentage') plt.xlabel('Columns') plt.legend(loc='upper left') plt.show()
如果不想提前过滤数据,也可以在循环内新增计数器变量记录实际绘制的柱子序号:
f, ax = plt.subplots(figsize=(20, 15)) plot_idx = 0 # 实际绘制的柱子索引 for col_name, nan_percent in zip(per_B.keys(), per_B.values): if nan_percent > 0: ax.bar(col_name, nan_percent, label = col_name) ax.text(plot_idx - 0.40, nan_percent + 0.5 , str(np.round(nan_percent,2))) plot_idx += 1 # 每画一个柱子索引自增1 ax.set_xticklabels([]) ax.set_xticks([]) plt.title('NaN Value percentage in Training Set B') plt.ylim(0,115) plt.ylabel('Percentage') plt.xlabel('Columns') plt.legend(loc='upper left') plt.show()
内容的提问来源于stack exchange,提问作者Huzaifa Arshad
相关产品推荐
相关产品推荐

