2

假设我有 250 个值显示从 0 公里到 10 公里的云高度。这些值分为三类:第 1 类包含 40 个值,第 2 类包含 120 个值,第 3 类包含 90 个值。因此,我用 bin = [0,1,2,3,4,5,6,7,8,9,10] 绘制三个直方图,其中 y 轴显示值的频率,即在 bin "3 " 在第 1 类中有 10 个值。这是我的问题,我不希望y轴显示频率,而是根据总值数字250的概率。我希望概率在这里是正确的词......实际上我不想要直方图显示,在类别 1 中 bin“3”中有 10 个值,我希望它显示有 10/250,因此 bin“3”中所有值的 4%。

我希望你能理解我的问题,并希望你能帮助我。我现在无法显示我的部分代码,因为我没有它......希望你能帮助我。谢谢!

4

1 回答 1

3

我会使用 Numpy 的直方图函数,并通过将直方图除以所有三个类别的总人口来自己标准化数据。结果可以用 matplotlib.bar() 绘制。

我不认为有绘制直方图的直接方法。如果您将 normed=True 传递给 matplotlibs histogram 函数,则权重被归一化为等于 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))

在此处输入图像描述

于 2013-02-12T10:38:06.280 回答