首页 文章

以清晰易读的方式在1轴上显示3个直方图 - matplotlib

提问于
浏览
11

我已经生成了3组数据,这些数据以numpy数组的形式组织 . 我有兴趣将这三组数据的概率分布绘制为标准直方图 . 所有三个分布看起来应该几乎相同,因此将所有三个分布在同一轴上以便于比较似乎是明智的 .

默认情况下,matplotlib直方图被绘制为条形图,这使得我想要的图像看起来非常混乱 . 因此,我的问题是是否可以强制pyplot.hist只绘制一个框/圆/三角形,其中条形图的顶部将是默认形式,这样我就可以在同一个图形上干净地显示所有三个分布或者是否我必须计算直方图数据,然后将其单独绘制为散点图 .

提前致谢 .

1 回答

  • 19

    有两种方法同时绘制三个直方图,但两者都不是你要求的 . 要做你要求的,你必须计算直方图,例如通过使用numpy.histogram,然后使用 plot 方法绘图 . 仅当您想通过设置每个点的大小将其他信息与您的点相关联时,才使用 scatter .

    使用 hist 的第一种替代方法是将所有三个数据集一次传递给 hist 方法 . 然后 hist 方法调整每个条的宽度和位置,以便清楚地显示所有三个组 .

    第二种方法是使用 histtype='step' 选项,为每组设置清晰的图 .

    这是一个演示这个的脚本:

    import numpy as np
    import matplotlib.pyplot as plt
    
    np.random.seed(101)
    a = np.random.normal(size=1000)
    b = np.random.normal(size=1000)
    c = np.random.normal(size=1000)
    
    common_params = dict(bins=20, 
                         range=(-5, 5), 
                         normed=True)
    
    plt.subplots_adjust(hspace=.4)
    plt.subplot(311)
    plt.title('Default')
    plt.hist(a, **common_params)
    plt.hist(b, **common_params)
    plt.hist(c, **common_params)
    plt.subplot(312)
    plt.title('Skinny shift - 3 at a time')
    plt.hist((a, b, c), **common_params)
    plt.subplot(313)
    common_params['histtype'] = 'step'
    plt.title('With steps')
    plt.hist(a, **common_params)
    plt.hist(b, **common_params)
    plt.hist(c, **common_params)
    
    plt.savefig('3hist.png')
    plt.show()
    

    以下是结果图:

    enter image description here

    请记住,您也可以使用面向对象的界面完成所有这些操作,例如:制作个别的子情节等

相关问题