我有兴趣绘制一组作为幂律分布的点的概率分布。此外,我想使用对数binning来平滑尾部的大波动。如果我只使用对数分箱,并将其绘制在日志对数刻度上,例如
pl.hist(MyList,log=True, bins=pl.logspace(0,3,50))
pl.xscale('log')
例如,问题是较大的箱子占了更多的点数,即我的箱子的高度没有按箱子大小缩放。
有没有办法使用对数binning,然后根据bin的大小使python缩放所有高度?我知道我可以手动以某种迂回方式做到这一点,但看起来这应该是一个存在的功能,但我似乎无法找到它。如果您认为直方图从根本上说是一种表达我的数据的糟糕方式,并且您有更好的想法,那么我也很乐意听到它。
谢谢!
答案 0 :(得分:4)
如果您对直方图有特殊要求,Matplotlib对您没有多大帮助。但是,您可以使用numpy轻松创建和操作直方图。
import numpy as np
from matplotlib import pyplot as plt
# something random to plot
data = (np.random.random(10000)*10)**3
# log-scaled bins
bins = np.logspace(0, 3, 50)
widths = (bins[1:] - bins[:-1])
# Calculate histogram
hist = np.histogram(data, bins=bins)
# normalize by bin width
hist_norm = hist[0]/widths
# plot it!
plt.bar(bins[:-1], hist_norm, widths)
plt.xscale('log')
plt.yscale('log')
显然,当您以非显而易见的方式呈现数据时,您必须非常小心如何正确标记您的y轴并编写信息图标题。