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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 19:24:03