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

时间:2016-03-11 23:44:01

标签: python numpy matplotlib scipy

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

  

追踪(最近一次通话):

我有一个包含几个零的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()

我不知道这里有什么问题。

2 个答案:

答案 0 :(得分:2)

您只能在numpy.array 而不是普通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

答案 1 :(得分:1)

Beam_irradiance_DNI>0

这应该有效,因为你只保留高于零的元素(map = c(0, 1, 0, 1)是一个用作索引的布尔掩码)。如果您想进一步使用它,请将其另存为变量,但如果您只想为直方图排除零,请不要再重新定义变量。