如何在 Python 直方图中有对数 bin

Posted

技术标签:

【中文标题】如何在 Python 直方图中有对数 bin【英文标题】:How to have logarithmic bins in a Python histogram 【发布时间】:2011-10-14 21:42:09 【问题描述】:

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

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

我需要 bin 在 log10 中等距分布。有什么可以做到的吗?

【问题讨论】:

如果这样做,您必须将每个 bin 中的计数除以 bin 宽度! 【参考方案1】:

以下代码说明了如何将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")

【讨论】:

【参考方案2】:

最直接的方法是只计算限制的 log10,计算线性间隔的 bin,然后通过提高到 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()

【讨论】:

【参考方案3】:

使用 logspace() 创建几何序列,并将其传递给 bins 参数。并将xaxis的比例设置为对数比例。

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

【讨论】:

请注意,np.logspace(0.1,1.0,...) 将创建从 10**0.110**1.0 的范围,而不是从 0.11.0 的范围 应该是np.logspace(np.log10(0.1),np.log10(1.0),50) 查看我的回答,了解如何使用 bins='auto' @AndreHolzner @OrangeSherbet 可以使用np.geomspace 直接指定端点。 请注意,照片与代码不匹配。 x 轴的范围应为 10**-1 到 10**0。【参考方案4】:

除了上述内容之外,在 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))

我会提醒,标准化垃圾箱可能存在问题。每个 bin 都比前一个大,因此必须除以它的大小以在绘图之前标准化频率,而且似乎我的解决方案和 HYRY 的解决方案都没有考虑到这一点。

来源:https://arxiv.org/pdf/cond-mat/0412004.pdf

【讨论】:

以上是关于如何在 Python 直方图中有对数 bin的主要内容,如果未能解决你的问题,请参考以下文章

使用python中的对数轴缩放和拟合对数正态分布

python中的对数y轴箱

如何在 Python 中向直方图添加特定的 x 刻度线? [复制]

如何在 python 中渲染 3D 直方图?

python——直方图均衡化

用python拟合直方图