如何在 Python 直方图中使用对数箱

据我所知,直方图函数中的 Log = True 选项仅指 y 轴。

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

我需要这些箱子在日志10中保持同样的间距。有什么办法可以做到这一点吗?

105142 次浏览

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

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()

log10 spaced bins

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

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")

chart