Matplotlib 绘制 nan 值

问题描述 投票:0回答:1

我正在尝试在 matplotlib 中绘制条形图,但它以某种方式绘制了 nan 值。

import pandas as pd
import matplotlib.pyplot as plt
import math 


engine_data= pd.read_excel('edb-emissions-databank_v28c_web.xlsx',
                    sheet_name = 'nvPM Emissions')

manufacturers = engine_data.value_counts('Manufacturer').index.values


def Average(engine_type, column, manufacturer):
   
    averages = []
    for manufacturer in manufacturers:  
        average = engine_data[(engine_data.iloc[:,2]== manufacturer) & (engine_data.iloc[:,5] == engine_type)][column].mean()
        averages.append(average)
    
    return averages


TF_particles = Average('TF','nvPM LTO Total Mass (mg)', manufacturers)
MTF_particles = Average('MTF','nvPM LTO Total Mass (mg)', manufacturers) 


results_TF = list(zip(manufacturers, TF_particles))
results_MTF = list(zip(manufacturers, MTF_particles))


for result in results_TF:
    if math.isnan(result[1]) == True:
        results_TF.remove(result)


for result in results_MTF:
    if math.isnan(result[1]) == True:
        results_MTF.remove(result)
        
fig ,ax = plt.subplots(1,2,figsize = (150,50))

for result in results_TF:
    ax[0].bar(result[0], result[1], color = 'red')

for result in results_MTF:
    ax[1].bar(result[0], result[1], color = 'blue')

ax[0].tick_params(axis='x', labelsize=70)
ax[0].tick_params(axis='y', labelsize=70)

ax[1].tick_params(axis='x', labelsize=30)
ax[1].tick_params(axis='y', labelsize=30)

plt.show()

我尝试删除 nan 值,但虽然我设法删除了一些值,但仍然有一些保留下来。我正在绘制发动机制造商与其在 LTO 循环中的平均排放量之间的关系。我有两个图表,因为我将我拥有的两种发动机类型分开:TF = 涡轮风扇和 MTF = 混合涡轮风扇。 NaN 是由于一些制造商没有任何 TF 引擎或反之亦然,所以当我压缩时,我得到了一些 nan 值。

This is what I get

python pandas database matplotlib nan
1个回答
0
投票

您正在迭代

results_TF
results_MTF
并尝试从两个列表中删除项目,因此它最终会跳过并且不会捕获所有 nan 值。制作新列表而不是修改它们然后将其添加到您的条形图可能更容易。

# new lists
results_TF_filtered = [(m, p) for (m, p) in results_TF if pd.notnull(p)]
results_MTF_filtered = [(m, p) for (m, p) in results_MTF if pd.notnull(p)]

fig ,ax = plt.subplots(1,2,figsize = (150,50))

# plotting bar chart
ax[0].bar([m for (m, _) in results_TF_filtered], [p for (_, p) in results_TF_filtered], color = 'red')
ax[1].bar([m for (m, _) in results_MTF_filtered], [p for (_, p) in results_MTF_filtered], color = 'blue')

更新代码:

import pandas as pd
import matplotlib.pyplot as plt


engine_data= pd.read_excel('edb-emissions-databank_v28c_web.xlsx',
                    sheet_name = 'nvPM Emissions')

manufacturers = engine_data.value_counts('Manufacturer').index.values


def Average(engine_type, column, manufacturer):
   
    averages = []
    for manufacturer in manufacturers:  
        average = engine_data[(engine_data.iloc[:,2]== manufacturer) & (engine_data.iloc[:,5] == engine_type)][column].mean()
        averages.append(average)
    
    return averages


TF_particles = Average('TF','nvPM LTO Total Mass (mg)', manufacturers)
MTF_particles = Average('MTF','nvPM LTO Total Mass (mg)', manufacturers) 


results_TF = list(zip(manufacturers, TF_particles))
results_MTF = list(zip(manufacturers, MTF_particles))

# new lists
results_TF_filtered = [(m, p) for (m, p) in results_TF if pd.notnull(p)]
results_MTF_filtered = [(m, p) for (m, p) in results_MTF if pd.notnull(p)]

fig ,ax = plt.subplots(1,2,figsize = (150,50))

# plotting bar chart
ax[0].bar([m for (m, _) in results_TF_filtered], [p for (_, p) in results_TF_filtered], color = 'red')
ax[1].bar([m for (m, _) in results_MTF_filtered], [p for (_, p) in results_MTF_filtered], color = 'blue')

ax[0].tick_params(axis='x', labelsize=70)
ax[0].tick_params(axis='y', labelsize=70)

ax[1].tick_params(axis='x', labelsize=30)
ax[1].tick_params(axis='y', labelsize=30)

plt.show()
© www.soinside.com 2019 - 2024. All rights reserved.