如何在Python中绘制含缺失值行位置的直方图(房价竞赛数据集)
解决Python中绘制缺失值行位置分布图的问题
你之前的代码train.isnull().sum(axis=1).plot(kind='hist', use_index=True)不符合预期的核心原因是:直方图(hist)的作用是统计不同缺失值数量的出现频次(比如统计有多少行包含0个缺失、1个缺失等),而你需要的是按行位置展示每行对应的缺失值数量,这是两种完全不同的可视化逻辑,use_index=True在直方图中也不会生效,因为直方图不会把行索引作为x轴维度。
要实现类似SAS的缺失值行位置可视化,你需要直接将行索引作为x轴,每行的缺失值数量作为y轴,用折线图或柱状图展示,以下是具体实现代码:
方法1:折线图(推荐,更清晰展示行位置趋势)
import matplotlib.pyplot as plt # 计算每行的缺失值数量 row_missing_counts = train.isnull().sum(axis=1) # 设置画布大小 plt.figure(figsize=(12, 6)) # 绘制行位置与缺失值数量的折线图,添加标记点增强可读性 plt.plot(row_missing_counts.index, row_missing_counts.values, marker='.', linestyle='-', markersize=2, alpha=0.6) # 设置标签与标题 plt.xlabel('行索引') plt.ylabel('该行缺失值数量') plt.title('每行缺失值数量分布(按行位置)') # 添加网格线辅助观察 plt.grid(axis='y', linestyle='--', alpha=0.7) plt.show()
方法2:柱状图(还原类似SAS的直方图样式)
如果需要更贴近SAS的柱状展示形式,可以使用条形图:
import matplotlib.pyplot as plt row_missing_counts = train.isnull().sum(axis=1) plt.figure(figsize=(15, 6)) # 每个行对应一个柱子,宽度设为1避免间隙 plt.bar(row_missing_counts.index, row_missing_counts.values, width=1) plt.xlabel('行索引') plt.ylabel('该行缺失值数量') plt.title('每行缺失值数量分布(按行位置)') plt.show()
额外说明
如果需要同时查看缺失值数量的频次分布(即你之前代码生成的直方图)和行位置分布,可以将两个图放在同一画布中对比:
import matplotlib.pyplot as plt row_missing_counts = train.isnull().sum(axis=1) fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(18, 6)) # 左图:行位置缺失值分布 ax1.plot(row_missing_counts.index, row_missing_counts.values, marker='.', linestyle='-', markersize=2, alpha=0.6) ax1.set_xlabel('行索引') ax1.set_ylabel('缺失值数量') ax1.set_title('按行位置的缺失值分布') ax1.grid(axis='y', linestyle='--', alpha=0.7) # 右图:缺失值数量的频次直方图 ax2.hist(row_missing_counts.values, bins=range(0, row_missing_counts.max()+2)) ax2.set_xlabel('每行缺失值数量') ax2.set_ylabel('行数') ax2.set_title('缺失值数量的频次分布') plt.tight_layout() plt.show()
内容的提问来源于stack exchange,提问作者aditt
相关产品推荐
相关产品推荐

