How to have logarithmic bins in a Python histogram

前端 未结 4 1209
天涯浪人
天涯浪人 2020-12-07 12:25

As far as I know the option Log=True in the histogram function only refers to the y-axis.

P.hist(d,bins=50,log=True,alpha=0.5,color=\'b\',histtype=\'step\')
         


        
相关标签:
4条回答
  • 2020-12-07 12:31

    In addition to what was stated, performing this on pandas dataframes works as well:

    some_column_hist = dataframe['some_column'].plot(bins=np.logspace(-2, np.log10(max_value), 100), kind='hist', loglog=True, xlim=(0,max_value))
    

    I would caution, that there may be an issue with normalizing the bins. Each bin is larger than the previous one, and therefore must be divided by it's size to normalize the frequencies before plotting, and it seems that neither my solution, nor HYRY's solution accounts for this.

    Source: https://arxiv.org/pdf/cond-mat/0412004.pdf

    0 讨论(0)
  • 2020-12-07 12:33

    use logspace() to create a geometric sequence, and pass it to bins parameter. And set the scale of xaxis to log scale.

    import pylab as pl
    import numpy as np
    
    data = np.random.normal(size=10000)
    pl.hist(data, bins=np.logspace(np.log10(0.1),np.log10(1.0), 50))
    pl.gca().set_xscale("log")
    pl.show()
    

    enter image description here

    0 讨论(0)
  • 2020-12-07 12:36

    The most direct way is to just compute the log10 of the limits, compute linearly spaced bins, and then convert back by raising to the power of 10, as below:

    import pylab as pl
    import numpy as np
    
    data = np.random.normal(size=10000)
    
    MIN, MAX = .01, 10.0
    
    pl.figure()
    pl.hist(data, bins = 10 ** np.linspace(np.log10(MIN), np.log10(MAX), 50))
    pl.gca().set_xscale("log")
    pl.show()
    

    0 讨论(0)
  • 2020-12-07 12:49

    The following code indicates how you can use bins='auto' with the log scale.

    import numpy as np
    import matplotlib.pyplot as plt
    
    data = 10**np.random.normal(size=500)
    
    _, bins = np.histogram(np.log10(data + 1), bins='auto')
    plt.hist(data, bins=10**bins);
    plt.gca().set_xscale("log")
    

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