如何在 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.1
到 10**1.0
的范围,而不是从 0.1
到 1.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的主要内容,如果未能解决你的问题,请参考以下文章