如何在Python的直方图中使用对数刻度?

102
据我所知,直方图函数中的Log=True选项仅涉及y轴。
P.hist(d,bins=50,log=True,alpha=0.5,color='b',histtype='step')

我需要将 bins 在 log10 中等间距分布。有什么方法可以实现吗?


1
如果您这样做,必须将每个箱中的计数除以箱宽! - Peaceful
4个回答

156

使用logspace()创建一个等比数列,并将其传递给bins参数。并将x轴的刻度设置为对数刻度。

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

在此输入图像描述


22
请注意,np.logspace(0.1,1.0,...)将创建一个范围从10**0.110**1.0,而不是从0.11.0 - Andre Holzner
13
应该翻译为:应该使用np.logspace(np.log10(0.1),np.log10(1.0),50) - JoseOrtiz3
1
请参考我的答案,了解如何使用bins='auto'。 - N. McA.
@AndreHolzner @OrangeSherbet 可以使用np.geomspace直接指定端点。 - Nicolai Weitkemper
请注意照片与代码不符。 x轴上的限制应该是从10的负1次方到10的0次方。 - Jvinniec

26
最直接的方法就是计算限制范围的log10值,计算出等距的线性间隔,并通过将其乘以10的幂来转换回去,如下所示:

最直接的方法就是计算限制范围的log10值,计算出等距的线性间隔,并通过将其乘以10的幂来转换回去。

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


17
以下代码展示了如何在对数刻度下使用bins='auto'
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")

图表


你为什么要在np.log10(data+1)中加上“+1”?我知道这可以规范化log(0)的情况,但是这不会在数据小于1时造成表示和分组方面的问题吗? - user1172131

1
除了之前提到的内容,对于pandas数据框,执行这个操作也是可行的:
some_column_hist = dataframe['some_column'].plot(bins=np.logspace(-2, np.log10(max_value), 100), kind='hist', loglog=True, xlim=(0,max_value))

我想提醒一下,将区间规范化可能存在问题。每个区间的大小都比前一个大,因此在绘制图表之前必须将其大小除以它的大小来规范化频率,而似乎我的解决方案和HYRY的解决方案都没有考虑到这一点。
来源:https://arxiv.org/pdf/cond-mat/0412004.pdf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接