如何用Matplotlib绘制包含NaN值列的箱线图
问题:使用Matplotlib绘制含NaN值的DataFrame箱线图(保留完整列数据)
给定如下DataFrame,每一列代表一个测量日:
9-1 9-2 9-3 9-4 9-5 0 23 16.0 18.0 18.0 26 1 27 18.0 20.0 17.0 33 2 10 9.0 15.0 8.0 30 3 23 30.0 19.0 5.0 15 4 10 10.0 23.0 29.0 12 5 50 13.0 8.0 20.0 23 6 12 24.0 31.0 27.0 35 7 10 29.0 NaN 7.0 22 8 34 NaN NaN 16.0 31 9 28 NaN NaN NaN 24
需求:使用Matplotlib的boxplot()函数绘制所有列的箱线图,包括含NaN值的列,同时保留无NaN列(如9-1、9-5)的全部数据,不能截断数据匹配有NaN列的行数。当前绘制仅显示无NaN列,需要实现包含所有列的目标效果。
解决方案
核心思路是为每一列单独提取非NaN数据组成列表,再传入Matplotlib的boxplot()函数,这样每列都保留自身完整的有效数据,不会被其他列的NaN截断。
步骤1:准备数据
先将DataFrame的每一列处理为去除NaN后的数组,组成一个列表:
import pandas as pd import matplotlib.pyplot as plt # 构建示例DataFrame data = { '9-1': [23,27,10,23,10,50,12,10,34,28], '9-2': [16.0,18.0,9.0,30.0,10.0,13.0,24.0,29.0,None,None], '9-3': [18.0,20.0,15.0,19.0,23.0,8.0,31.0,None,None,None], '9-4': [18.0,17.0,8.0,5.0,29.0,20.0,27.0,7.0,16.0,None], '9-5': [26,33,30,15,12,23,35,22,31,24] } df = pd.DataFrame(data) # 提取每列非NaN数据组成列表 plot_data = [df[col].dropna().values for col in df.columns]
步骤2:使用Matplotlib绘制箱线图
将处理好的plot_data传入boxplot(),并设置x轴标签为列名:
plt.figure(figsize=(10,6)) plt.boxplot(plot_data) # 设置x轴标签 plt.xticks(range(1, len(df.columns)+1), df.columns) plt.title('每日测量数据箱线图') plt.ylabel('测量值') plt.xlabel('测量日') plt.grid(axis='y', linestyle='--', alpha=0.7) plt.show()
原理说明
Matplotlib的boxplot()函数支持接收由多个数组组成的列表,每个数组对应一个箱线图。通过对每列单独执行dropna()操作,我们确保了每列的有效数据都被完整保留,不会因为其他列存在NaN而丢失数据,同时所有列都会被绘制出来,包括含NaN的列。
内容的提问来源于stack exchange,提问作者Dylan
相关产品推荐
相关产品推荐

