我正在尝试使用matplotlib绘制直方图的一部分。
我不想绘制具有大量异常值和大值的整个直方图,而是只关注一小部分。原始直方图如下所示:
hist(data, bins=arange(data.min(), data.max(), 1000), normed=1, cumulative=False)
plt.ylabel("PDF")
聚焦后看起来像这样:
hist(data, bins=arange(0, 121, 1), normed=1, cumulative=False)
plt.ylabel("PDF")
请注意,最后一个bin被拉伸,所有Y刻度中的最差刻度被缩放,因此总和恰好为1(因此根本不考虑当前范围之外的点)
我知道我可以通过在整个可能范围内绘制直方图然后将轴限制到我感兴趣的部分来实现我想要的效果,但是它浪费了很多时间来计算我不会使用的箱子/无论如何。
hist(btsd-40, bins=arange(btsd.min(), btsd.max(), 1), normed=1, cumulative=False)
axis([0,120,0,0.0025])
是否有一种快速简便的方法来绘制聚焦区域但仍然能够正确地获得Y比例?
答案 0 :(得分:5)
为了绘制直方图的子集,我认为你无法计算整个直方图。
您是否尝试使用numpy.histogram
计算直方图,然后使用pylab.plot
或其他内容绘制区域?即。
import numpy as np
import pylab as plt
data = np.random.normal(size=10000)*10000
plt.figure(0)
plt.hist(data, bins=np.arange(data.min(), data.max(), 1000))
plt.figure(1)
hist1 = np.histogram(data, bins=np.arange(data.min(), data.max(), 1000))
plt.bar(hist1[1][:-1], hist1[0], width=1000)
plt.figure(2)
hist2 = np.histogram(data, bins=np.arange(data.min(), data.max(), 200))
mask = (hist2[1][:-1] < 20000) * (hist2[1][:-1] > 0)
plt.bar(hist2[1][mask], hist2[0][mask], width=200)
原始直方图:
手动计算直方图:
手动计算直方图,裁剪: (N.B。:值较小,因为箱子较窄)
答案 1 :(得分:4)
我认为,您可以使用给定的权重来规范化您的数据。 (repeat
是一个numpy函数)。
hist(data, bins=arange(0, 121, 1), weights=repeat(1.0/len(data), len(data)))