Matplotlib直方图在第二个直方图箱中添加一个小条

时间:2016-03-09 12:22:48

标签: python matplotlib plot histogram

我认为在我用matplotlib绘制直方图的某些情况下,可能会有一些问题:

pylab.figure()
H, bins, _  = pylab.hist([2,2])
print H
print bins

结果是:

histogram

[ 0.  0.  0.  0.  0.  2.  0.  0.  0.  0.]
[ 1.5  1.6  1.7  1.8  1.9  2.   2.1  2.2  2.3  2.4  2.5]

你是否看到情节"碰撞"在1.5到1.6之间,它来自哪里?我怎么能避免它?

2 个答案:

答案 0 :(得分:0)

这很有趣。

您可以查看生成的矩形:

ax = plt.subplot(111)
h, bins, rects = ax.hist([2, 2])

for r in rects:
    print(r.get_bbox())

# Bbox(x0=1.5, y0=0.0, x1=1.6, y1=0.0)
# Bbox(x0=1.6, y0=0.0, x1=1.7, y1=0.0)
# Bbox(x0=1.7, y0=0.0, x1=1.8, y1=0.0)
# Bbox(x0=1.8000000000000003, y0=0.0, x1=1.9000000000000001, y1=0.0)
# Bbox(x0=1.9, y0=0.0, x1=2.0, y1=0.0)
# Bbox(x0=1.9999999999999998, y0=0.0, x1=2.0999999999999996, y1=2.0)
# Bbox(x0=2.1000000000000005, y0=0.0, x1=2.2000000000000006, y1=0.0)
# Bbox(x0=2.2, y0=0.0, x1=2.3, y1=0.0)
# Bbox(x0=2.3, y0=0.0, x1=2.4, y1=0.0)
# Bbox(x0=2.4000000000000004, y0=0.0, x1=2.5000000000000004, y1=0.0)

显然,直方图函数为每个bin生成一个矩形,甚至是空的。虽然它们的高度为0,但它们会传递给渲染器,在某些情况下会产生虚假的东西。

我不知道如何防止这种情况发生。但是,有一个解决方案,但它相当hackish。 hist函数为每个bin放置一个矩形块。可以手动迭代这些补丁并删除零高度的补丁:

ax = plt.subplot(111)
h, bins, rects = ax.hist([2, 2])

ax.patches = [p for p in ax.patches if p.get_height() > 0]

答案 1 :(得分:0)

这似乎是一个渲染问题。将数字保存为pdf并未显示一瞥。因此,根据您最终使用的数字,这可能会成为一个问题。