Python Matplotlib直方图bin shift

时间:2016-06-13 17:14:20

标签: python python-2.7 matplotlib histogram cdf

我已从列表中创建了累积(CDF)直方图,这是我想要的。然后我从列表中的每个元素中减去一个固定值(通过使用x = [ fixed_value - i for i in myArray]),只需将二进制位移一定数量即可。然而,这使得我的CDF直方图在y轴上反转。我认为除了x轴(箱子)移动固定量之外,它应该看起来与原件相同。

那么有人可以解释我做错了什么或给出解决方案只是移动垃圾箱而不是用新数组重新创建另一个直方图?

编辑:

有时候我会看到这个错误:

>>> plt.hist(l,bins, normed = 1, cumulative = True)
C:\Python27\lib\site-packages\matplotlib\axes.py:8332: RuntimeWarning: invalid value encountered in true_divide
  m = (m.astype(float) / db) / m.sum()

但它不是第二个减法案例所独有的。并且plt.hist返回一个NaN数组。不确定这是否有帮助,但我认为我正在接近搞清楚。

编辑: 这是我的两张图。第一个是“好”的。第二个是转移的“坏”:

我想做的就是将第一个箱子移动一定数量。但是,当我从直方图中的每个列表中减去相同的值时,它似乎改变了y方向和x方向上的直方图。另外,请注意第一个直方图是否都是负值,第二个是正数。我似乎通过保持负面来修复它(我使用original_array[i] - fixed_value <0,而不是fixed_value - original_array[i] > 0

2 个答案:

答案 0 :(得分:1)

我认为问题可能在于如何计算移位值。这个例子适合我:

import numpy as np
import matplotlib.pylab as pl

original_array = np.random.normal(size=100)
bins = np.linspace(-5,5,11)

pl.figure()
pl.subplot(121)
pl.hist(original_array, bins, normed=1, cumulative=True, histtype='step')

offset = -2
modified_array = [original_value + offset for original_value in original_array]

pl.subplot(122)
pl.hist(modified_array, bins, normed=1, cumulative=True, histtype='step')

enter image description here

请注意,numpy可能会让您的生活更轻松(对于大型original_array批次更快);例如,如果您的数据是numpy.array,您也可以将其写为:

modified_array = original_array + offset

答案 1 :(得分:1)

您的问题与直方图无关,但纯粹是因为您编写x = [ fixed_value - i for i in myArray]而不是x = [i - fixed_value for i in myArray]。请检查以下示例:

import numpy as np
import pylab as pl

x = np.linspace(0, 10., 1000)
y = np.exp(x)

x2 = [ 5. - i  for i in x]
x3 = [ i  - 5. for i in x]

pl.plot(x , y)
pl.plot(x2, y)
pl.plot(x3, y)

如果您绘制那些,您会看到第二个绘图是第一个绘图的镜像移位版本,第三个绘图具有您正在寻找的移位。