【问题标题】:Matplotlib histogram is adding a small bar at the second histogram binMatplotlib 直方图在第二个直方图箱中添加了一个小条
【发布时间】:2016-06-23 19:43:47
【问题描述】:

我认为 hist 函数可能存在一些问题,在某些情况下,当我使用 matplotlib 绘制直方图时:

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

结果是:

[ 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 之间“颠簸”,它是从哪里来的?如何避免?

【问题讨论】:

  • np.sum((ar < 2))返回什么?
  • 您能否将数组或至少将数组的大部分内容编辑到问题中,以便它仍然在 0 处显示这个“凹凸”?尽量让它尽可能小。 :)
  • 您的 bin 左边缘包含 -0.5 也许您可以更改 pylab.hist 的 align 选项并摆脱 -0.5 align : ['left' | '中' | '正确']
  • @Mseifert 我只是将问题简化为显示问题的最小表达式。
  • @DanPatterson 谢谢!这是一个很好的建议:)

标签: python matplotlib plot histogram


【解决方案1】:

这很有趣。

你可以看看生成的矩形:

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]

【讨论】:

  • 是的,我也会……如果没有好的解决方法,可能会被认为是 matplotlib 中的错误。
  • 让我们等几天,否则我会报告给matplotlit
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    相关资源
    最近更新 更多