我们有一组数据。 我们想要它们的直方图并以对数标度绘制它们。我们使用以下代码:
y,binEdges=np.histogram(hist_data,bins=200)
bincenters = 0.8*(binEdges[1:]+binEdges[:-1])
p.plot(bincenters,y,'-')
p.yscale('log', nonposy='clip')
结果是:
然而,当我尝试增加bin(即从bin = 200到bin = 600)时,结果是:
如何只保留每个直方图的线而不是整个光谱?
答案 0 :(得分:2)
你看到的是一些箱子为空,因此它绘制了一个来自f(y) -> 0 -> f(y+delta) -> 0 -> f(y+2*delta)
的矩形。解决这个问题的一个常见技巧是不要使用尖锐的截止值作为你的bin(我们称之为 kernal )。例如,您可以使用Kernel density estimation来"平滑"超出直方图。在这种情况下,你将一堆高斯人放在你的数据点中心 - 总和反映了潜在的概率分布。您可以使用scipy来执行KDE或包含自动绘图的精美包seaborn
。来自链接的seaborn示例的图片很好地说明了这一点:
使用matplotlib的hist
而不使用绘图框,只使用histtype="step"
中传递的行。
答案 1 :(得分:1)
如果某些垃圾箱为空,您可以使用boolean indexing过滤掉它们:
p.plot(bincenters[y>0],y[y>0],'-')