【问题标题】:Plot a histogram without the zero values in python?在python中绘制没有零值的直方图?
【发布时间】:2016-03-11 23:44:00
【问题描述】:

当我尝试制作没有零值的直方图时,出现错误:

Traceback(最近一次调用最后一次):。

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

我不知道这里出了什么问题。

【问题讨论】:

  • 这些是浮点数吗?如果是这样,检查 exact 是否等于 0 是不够的。您需要检查是否abs(val) < epsilon。此外,您可以仅授予非零值并创建一个新数组,而不是替换为 NaN。然后你不要修改你的原始数据。而且看起来你的变量是空的......
  • 我在您的列表中看不到任何零。
  • @Suever 感谢您的 cmets。我已经包含了整个代码。您现在可以建议一种方法吗?

标签: python numpy matplotlib scipy


【解决方案1】:

您只能对numpy.array 执行逻辑索引(data[data != 0]而不是普通的 python 列表。如果要从 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

【讨论】:

  • 感谢您的回答!是的,我将列表更改为一个 numpy 数组,它现在可以工作了!非常感谢!
  • @ArvindSastry 如果这对您有用,请考虑将其标记为帮助可能搜索相同问题的人的解决方案。
  • @Suever。我面临一个问题 "ValueError: cannot convert float NaN to integer" 。请建议我是否可以处理这个
【解决方案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&gt;0 是用作索引的布尔掩码)。如果您想进一步使用它,请将其保存为变量,但如果您只想为直方图排除零点,请不要重新定义变量。

【讨论】:

  • 您好!我试过这个方法,但它不起作用。我收到如下错误:TypeError:不可排序的类型:list() > int()。是的,我不想进一步使用它,我只想从直方图中排除零
  • @ArvindSastry - 也许只是在plt.hist-line 之前执行Beam_irradiance_DNI = np.array(Beam_irradiance_DNI)
  • @ArvindSastry - 请不要忘记接受您的问题的答案之一。 :-)
  • @lafemmecosmique 您还需要索引条件array[:,0][array[:,0] &gt; 0]
  • @MSeifert 非常感谢您回答我的随机问题。你刚刚在某件事上为我节省了大量时间。干杯! :)
猜你喜欢
  • 2011-08-21
  • 1970-01-01
  • 2018-10-26
  • 1970-01-01
  • 2018-05-23
  • 2012-03-12
  • 1970-01-01
  • 1970-01-01
  • 2014-06-28
相关资源
最近更新 更多