在python中绘制没有零值的直方图?

2024-05-18 22:14:15 发布

您现在位置:Python中文网/ 问答频道 /正文

当我试图制作一个没有零值的直方图时,会得到一个错误:

Traceback (most recent call last):.

我有一个包含几个零的Beam_irradiance_DNI值的列表。我可以做直方图,但我不想要零值。

import matplotlib.pyplot as plt
import numpy as np

import csv

# Reading data from csv file
with open('Upington_DNI.csv') as csvfile:
readCSV = csv.reader(csvfile, delimiter=',')
Hour_of_year = []
Beam_irradiance = []
for row in readCSV:
    hour = row[0]
    DNI = row[1]
    Hour_of_year.append(hour)
    Beam_irradiance.append(DNI)
Hours_since00hrsJan1 = [float(Hour_of_year[c]) for c in       range(1,len(Hour_of_year))]
Beam_irradiance_DNI=[float(Beam_irradiance[c]) for c in range(1,len(Beam_irradiance))]

plt.figure(3)
Beam_irradiance_DNI[ Beam_irradiance_DNI==0 ] = np.nan
plt.hist(Beam_irradiance_DNI, color="grey")
plt.title("Histogram for Beam irradiance - DNI")
plt.xlabel("Beam irradiance - DNI [W/m2]"); plt.ylabel("Probability of  occurrence")
plt.show()

我不知道这里怎么了。


Tags: ofcsvinimportforasplt直方图
2条回答
import numpy as np
Beam_irradiance_DNI = np.array(Beam_irradiance_DNI)
plt.hist(Beam_irradiance_DNI[Beam_irradiance_DNI>0], color="grey")

这应该有效,因为您只保留高于零的元素(Beam_irradiance_DNI>0是用作索引的布尔掩码)。如果你想进一步使用这个,把它保存为一个变量,但是如果你只想排除直方图中的零,就不用重新定义你的变量了。

只能对^{}而不是普通python列表执行逻辑索引(data[data != 0])。如果要从python列表中移除值,则需要使用列表理解来执行此操作。

newvalues = [x for x in Beam_irradiance_DNI if x != 0]

另一种方法是将python列表实际转换为numpy数组。

nparray = np.array(Bean_irradiance_DNI)

然后,您将能够执行您想要执行的逻辑索引

nparray[nparray == 0] = np.nan

另一种方法是改变数组本身,只将非零值传递给hist

plt.hist(Beam_irradiance_DNI[Beam_irradiance_DNI != 0], color="grey")

如果您仍然对零有问题,很可能是因为这些数字被存储为浮点数,并且它们的值并不是完全零。为此,您需要使用以下条件来检测“零”。

is_zero = np.absolute(Beam_irradiance_DNI) < np.finfo(float).eps
Beam_irradiance_DNI[is_zero] = np.nan

相关问题 更多 >

    热门问题