更新:再次抱歉,由于正确的评论,代码已更新。并且图形仍然存在一些问题 - 一个hist转移到另一个。
更新:对不起,这些his有不同数量的垃圾箱。即使在这一点上设置'5'作为plt.hist
中的二进制数也无济于事
下面的代码计算同一数据源上的两个直方图。
绘制这些直方图表明它们并不重合。
np.hist
的标记:它返回两个数组的元组 - 包含边框和多个计数的二进制值。所以我认为将bin边缘位置的值居中是合理的。
import numpy as np
import matplotlib.pyplot as plt
s = [1,1,1,1,2,2,2,3,3,4,5,5,5,6,7,7,7,7,7,7,7]
xmin = 1
xmax = 7
step = 1.
print 'nbins=',(xmax-xmin)/step
print np.linspace(xmin, xmax, (xmax-xmin)/step)
h1 = np.histogram(s, bins=np.linspace(xmin, xmax, (xmax-xmin)/step))
print h1
def calc_centers_of_bins(x):
return list(x[i]+(x[i]-x[i+1])/2.0 for i in xrange(len(x)-1))
x = h1[1].tolist()
print x
y = h1[0].tolist()
plt.bar(calc_centers_of_bins(x),y, width=(x[-1]-x[0])/(len(y)), color='red', alpha=0.5)
plt.hist(s, bins=5,alpha=0.5)
plt.grid(True)
plt.show()
答案 0 :(得分:4)
在这两种情况下,您使用的是不同的垃圾箱。在您的情况下,np.linspace(xmin, xmax, (xmax-xmin)/step)
有5个分箱,但您告诉plt.hist
使用6个分箱。
您可以通过查看每个输出来看到这一点:
h1 = np.histogram(s, bins=np.linspace(xmin, xmax, (xmax-xmin)/step))
h_plt = plt.hist(s, bins=6,alpha=0.5)
然后:
>>> h1[1]
array([ 1. , 2.2, 3.4, 4.6, 5.8, 7. ])
>>> h_plt[1]
array([ 1., 2., 3., 4., 5., 6., 7.])
我会用:
y, x = np.histogram(s, bins=np.linspace(xmin, xmax, (xmax-xmin)/step))
nbins = y.size
# ...
plt.hist(s, bins=nbins, alpha=0.5)
然后您的直方图匹配,但您的情节仍然不会,因为您已将np.histogram
的输出绘制在容器的中心,但plt.bar
需要左边的数组:
plt.bar(left, height, width=0.8, bottom=None, hold=None, **kwargs)
参数
----------
left
:标量序列
条形左侧的x
坐标
height
:标量序列
酒吧的高度
你想要的是:
import numpy as np
import matplotlib.pyplot as plt
s = [1,1,1,1,2,2,2,3,3,4,5,5,5,6,7,7,7,7,7,7,7]
xmin = 1
xmax = 7
step = 1
y, x = np.histogram(s, bins=np.linspace(xmin, xmax, (xmax-xmin)/step))
nbins = y.size
plt.bar(x[:-1], y, width=x[1]-x[0], color='red', alpha=0.5)
plt.hist(s, bins=nbins, alpha=0.5)
plt.grid(True)
plt.show()