【问题标题】:plot specific probability in matplotlib hist在 matplotlib hist 中绘制特定概率
【发布时间】:2013-02-12 10:08:26
【问题描述】:

假设我有 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%。

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

【问题讨论】:

    标签: matplotlib histogram


    【解决方案1】:

    我会使用 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))
    

    【讨论】:

    • 谢谢您的回答,我已经知道了,但据我所知,normed参数仅对特定直方图的总数进行归一化,但我希望将其归一化为总数所有三个直方图的数量,即所有三个类别。所以我可以对第 1 类的第一个直方图进行规范化,但它会被规范化为 40 个值的总数,但总数是 250,这就是我希望它被规范化的值。
    • 没问题,也许我解释得不对;-)。但是非常感谢您的回答,这正是我想要的!
    • 现在我有另一个问题。因为我还想在条形图上绘制垂直线......如果我用“vlines”这样做,那么我会得到我的垂直线,但是这些条形不再可见。你知道我如何在条形图中绘制一条垂直线,比如 x=2.4 吗?
    • vlines 适合我。但也许您的最大 y 值太大,以至于条形被挤压到底轴。例如,尝试从 min 和 max yticks 中设置 min 和 max y 值,如果可行,您可能会找到更好的方法来设置 max x 和 y 值(或轴上的“硬” set_xlim() )。这对我有用,如果你在绘制直方图后设置它: axs[0].vlines(2.4, np.min(axs[0].get_yticks()), np.max(axs[0].get_yticks()) )
    • 谢谢!现在它起作用了,我认为这确实是最大值的设置。
    猜你喜欢
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多