numpy histogram cumulative density does not sum to 1

后端 未结 2 1864
误落风尘
误落风尘 2020-12-05 11:44

Taking a tip from another thread (@EnricoGiampieri\'s answer to cumulative distribution plots python), I wrote:

# plot cumulative density function of nearest         


        
相关标签:
2条回答
  • 2020-12-05 12:01

    You need to make sure your bins are all width 1. That is:

    np.all(np.diff(base)==1)
    

    To achieve this, you have to manually specify your bins:

    bins = np.arange(np.floor(nearest.min()),np.ceil(nearest.max()))
    values, base = np.histogram(nearest, bins=bins, density=1)
    

    And you get:

    In [18]: np.all(np.diff(base)==1)
    Out[18]: True
    
    In [19]: np.sum(values)
    Out[19]: 0.99999999999999989
    
    0 讨论(0)
  • 2020-12-05 12:07

    You can simply normalize your values variable yourself like so:

    unity_values = values / values.sum()

    A full example would look something like this:

    import numpy as np
    import matplotlib.pyplot as plt
    
    x = np.random.normal(size=37)
    density, bins = np.histogram(x, normed=True, density=True)
    unity_density = density / density.sum()
    
    fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2, sharex=True, figsize=(8,4))
    widths = bins[:-1] - bins[1:]
    ax1.bar(bins[1:], density, width=widths)
    ax2.bar(bins[1:], density.cumsum(), width=widths)
    
    ax3.bar(bins[1:], unity_density, width=widths)
    ax4.bar(bins[1:], unity_density.cumsum(), width=widths)
    
    ax1.set_ylabel('Not normalized')
    ax3.set_ylabel('Normalized')
    ax3.set_xlabel('PDFs')
    ax4.set_xlabel('CDFs')
    fig.tight_layout()
    

    enter image description here

    0 讨论(0)
提交回复
热议问题