Matplotlib绘制柱状图仍残留NaN值问题求助
解决Matplotlib柱状图NaN值残留问题
问题核心
你遇到的NaN残留,本质是部分厂商无对应类型发动机数据,仅单纯删除NaN值并未同步过滤掉这些无数据的厂商条目,导致绘图时仍保留了它们的位置,出现空柱或异常显示。
针对性解决方案
1. 双重筛选有效数据
直接过滤出有对应类型有效排放数据的厂商,确保绘图数据集完全不含该类型数据缺失的厂商:
import pandas as pd import matplotlib.pyplot as plt # 假设原始数据存储在df中 # 筛选TF类型的有效数据(排除NaN) tf_valid = df[(df['engine_type'] == 'TF') & df['lto_emission'].notna()] # 筛选MTF类型的有效数据 mtf_valid = df[(df['engine_type'] == 'MTF') & df['lto_emission'].notna()] # 分图绘制 fig, (ax_tf, ax_mtf) = plt.subplots(1, 2, figsize=(14, 6)) # TF发动机柱状图 ax_tf.bar(tf_valid['manufacturer'], tf_valid['lto_emission'], color='#2ecc71') ax_tf.set_title('TF涡扇发动机LTO循环平均排放') ax_tf.set_xlabel('制造商') ax_tf.set_ylabel('平均排放值') ax_tf.tick_params(axis='x', rotation=45) # MTF发动机柱状图 ax_mtf.bar(mtf_valid['manufacturer'], mtf_valid['lto_emission'], color='#3498db') ax_mtf.set_title('MTF混合涡扇发动机LTO循环平均排放') ax_mtf.set_xlabel('制造商') ax_mtf.set_ylabel('平均排放值') ax_mtf.tick_params(axis='x', rotation=45) plt.tight_layout() plt.show()
2. 分组聚合后过滤
若需按厂商+发动机类型分组计算均值,可先聚合再删除NaN条目:
# 分组计算平均排放,自动排除单组内的NaN grouped_data = df.groupby(['manufacturer', 'engine_type'])['lto_emission'].mean().dropna() # 重置索引转为二维表格 clean_df = grouped_data.reset_index() # 拆分两类发动机数据 tf_group = clean_df[clean_df['engine_type'] == 'TF'] mtf_group = clean_df[clean_df['engine_type'] == 'MTF'] # 后续绘图逻辑同方案1
3. 绘图时跳过NaN位置
若必须保留所有厂商(即使某类型无数据),可手动过滤NaN对应的条目再绘图:
# 假设已获取所有厂商列表tf_manus和对应排放数据tf_emissions valid_mask = ~pd.isna(tf_emissions) ax_tf.bar( [tf_manus[i] for i in range(len(tf_manus)) if valid_mask[i]], tf_emissions[valid_mask] )
关键提示
单纯调用dropna()只是删除了含NaN的行,但如果厂商列表是从原始全量数据提取的,就会出现“厂商存在但对应数据为空”的错位情况。核心要保证绘图用的厂商列表和排放数据一一对应,且均不含NaN相关条目。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

