假设我有250个值显示从0 km到10 km的云高度。这些值分为三类:类别1包含40个值,类别2包含120个值,类别3包含90个值。因此,我用bins = [0,1,2,3,4,5,6,7,8,9,10]绘制三个直方图,其中y轴显示值的频率,即在bin中# 34; 3"在类别1中有10个值。 这是我的问题,我不希望y轴显示频率,但是根据总值250来表示概率。我希望概率在这里是正确的词...实际上我不是'我想要直方图显示,在类别1中,bin" 3"中有10个值,我希望它显示有10/250,所以4%的所有值都在bin" 3& #34;
我希望你理解我的问题,你可以帮助我。我现在无法显示部分代码,因为我不能跟我一起...希望你能帮助我。感谢名单!
答案 0 :(得分:3)
我会使用Numpy的直方图函数,并通过将直方图除以所有三个类别的总人口来自行标准化数据。可以使用matplotlib.bar()来绘制结果。
我不认为有直接的方法来绘制直方图。如果将normed = True传递给matplotlibs直方图函数,则将权重归一化为等于1,以便不能用于传递整个直方图的“相对权重”。
from matplotlib.ticker import FuncFormatter
def myfunc(x, pos=0):
return '%1.1f%%' % (x*100)
cat1 = np.random.randint(0,11,40)
cat2 = np.random.randint(0,11,120)
cat3 = np.random.randint(0,11,90)
totalpop = float(cat1.size + cat2.size + cat3.size)
fig, axs = plt.subplots(3,1,figsize=(10,9))
fig.subplots_adjust(hspace=.3)
for n, cat in enumerate([cat1,cat2,cat3]):
hist, bins = np.histogram(cat, bins=11, range=(0,11))
axs[n].bar(bins[:-1], hist/ totalpop, align='center', facecolor='grey', alpha=0.5)
axs[n].set_title('Category %i' % n)
print 'Category %i:' % n, 'size: %i' % cat.size, 'relative size: %1.2f' % (cat.size / float(totalpop))
for ax in axs:
ax.set_xticks(range(11))
ax.set_xlim(-1,11)
ax.yaxis.set_major_formatter(FuncFormatter(myfunc))