【问题标题】:Python - How to have same maximum on multiple histogramsPython - 如何在多个直方图上具有相同的最大值
【发布时间】:2018-06-28 13:49:14
【问题描述】:

我有两个分布不同的分布,比如说

a=N.random.normal(0,0.5,500)      
b=N.random.normal(1,3.,500)

我想制作一个它们的直方图,其中最大值处于同一水平。

如果我使用 density=True 参数制作标准化直方图,它将使两个直方图的面积都为 1,但不会改变最大值不同的事实。

P.hist(a, histtype='step', lw=2, cumulative=True)
P.hist(b, histtype='step', color='r', lw=2, density=True)

我想要的是制作一个用最大值“标准化”的直方图。我的意思是当蓝色和红色直方图的最大值相同时,可以很容易地比较它们。非常感谢您的帮助。

【问题讨论】:

    标签: python matplotlib plot histogram


    【解决方案1】:

    我不确定我是否真的会这样做,但如果您愿意,我认为最好的方法是添加两个轴(也可以让您看到它们的实际高度)。例如,请看这里:https://matplotlib.org/gallery/api/two_scales.html

    import numpy as np
    from matplotlib import pyplot as plt
    fig, ax1 = plt.subplots()
    ax1.hist(a, histtype='step', color='b', lw=2, density=True)
    ax1.tick_params(axis='y', labelcolor='b')
    ax2 = ax1.twinx()
    ax2.hist(b, histtype='step', color='r', lw=2, density=True)
    ax2.tick_params(axis='y', labelcolor='r')
    

    这给出了以下输出(我认为,这看起来比您获得的更糟糕;我还在第一个图中将累积 = True 更改为 density=True 以与您提供的图一致):

    此外,严格来说,这并不能确保最大值真的相同。如果你想这样做,你可以通过这样做来强制它,例如

    import numpy as np
    from matplotlib import pyplot as plt
    fig, ax1 = plt.subplots()
    n1, _, _ = ax1.hist(a, histtype='step', color='b', lw=2, density=True)
    ax1.tick_params(axis='y', labelcolor='b')
    ax2 = ax1.twinx()
    n2, _, _ = ax2.hist(b, histtype='step', color='r', lw=2, density=True)
    ax2.tick_params(axis='y', labelcolor='r')
    ax1.set_ylim([0, n1.max()*1.1])
    ax2.set_ylim([0, n2.max()*1.1])
    

    【讨论】:

    • 谢谢,太好了!
    【解决方案2】:

    以下代码将使ab 具有相同的最大值:

    a *= b.max()/a.max()
    

    a 中的累积标志可能会破坏这一点,它应该放在生成直方图之前。

    【讨论】:

    • 您好,感谢您的回答,但这并不是我所需要的。我想要的是所有分布都具有相同的最大值,但不改变标准偏差
    猜你喜欢
    • 2012-10-03
    • 2017-05-26
    • 2019-03-08
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    相关资源
    最近更新 更多