如何让Matplotlib中的误差线最后渲染

15

我正在尝试将带有误差条的实验数据与我的模拟数据叠加绘制。但是,误差条似乎首先被渲染,并且随后被覆盖(请参见下文)。

我已经尝试使用zorder,但仍然得到相同的结果。 我正在使用的代码是:

    for i in range(1,len(pf)):
            pf[i,:] = av_pf_scale * pf[i,:]
            pylab.semilogy(pf[0,0:180],pf[i,0:180],color='0.75')

    pylab.semilogy(av_pf[0:180],color='r')
    pylab.semilogy(av_mie[0:180],color='g', linestyle='-')

    pylab.draw()
    f = pylab.errorbar(ang,data[j],
                            yerr = delta_data[j],
                            fmt = 'o',
                            markersize = 3,
                            color = 'b',
                            zorder = 300,
                            antialiased = True)
我希望有人告诉我如何使误差线呈现在顶部。

多图


你能提供一个更清晰的例子吗?我在仔细观察你的图表,可以看到其他数据上方有蓝色错误线条(它们在灰色混乱和红色和绿色线条之上)。这些值似乎相对较小,因此没有可见的垂直线,但这是数据本身而非matplotlib的问题。 - danodonovan
1
你尝试过将zorder增加到300以上吗?另外,奇怪的是误差线的末端被渲染在灰色线条之上,但线条却没有。 (还要注意第一个和最后一个数据点的负下限误差边界。) - ebarr
或者尝试将灰色线条的zorder设置为“-100”。 - tacaswell
+1 很好的问题!将来最好提供一些其他人可以运行而不需要访问你的数据的问题示例(请参考我在答案中的示例)http://sscce.org/。 - tacaswell
谢谢,那是好建议。将来我会这么做。 - Caustic
2个回答

16

看起来这是 matplotlib 中的一个错误,即 errorbarzorder 参数未正确传递到误差棒垂直线部分。

重现您的问题:

import matplotlib.pyplot as plt
fig = plt.figure()
ax = plt.gca()
[ax.plot(rand(50),color='0.75') for j in range(122)];
ax.errorbar(range(50),rand(50),yerr=.3*rand(50))
plt.draw()

error bar fail 不太正规的解决方法:

fig = plt.figure()
ax = plt.gca()
[ax.plot(rand(50),color='0.75',zorder=-32) for j in range(122)];
ax.errorbar(range(50),rand(50),yerr=.3*rand(50))
plt.draw()

误差棒黑客

将此作为问题报告给matploblibhttps://github.com/matplotlib/matplotlib/issues/1622(现已修复并关闭)


@tcaswell 非常感谢您。您再次帮了我一个大忙。我曾尝试将zorder设置为正数,但从未考虑过强制底层图形为负数。太棒了。 - Blink
@William 希望有所帮助。你应该更新你的 mpl 版本,因为我认为那个补丁是 1.2.1 版本的。 - tacaswell
@tcaswell,我刚遇到了一个看起来与1.4.2相同的问题,重现了你上面有缺陷的1.2.0(?)图。已在长期关闭的Github工单中添加了评论... - andybuckley
4
这个 bug 在 matplotlib 2.0.0 版本中也重新出现了。我已经创建/重新打开了这个问题的工单。还有一个更好的“hack”被提到,可以使用 zorder=3 来修复 plt.errorbar。我将相应地编辑答案。 - Frank Breitling

1
这是matplotlib中已知的一个bug。链接到Github问题页面 临时解决方案:在调用plt.errorbar时添加参数zorder=3,例如:plt.errorbar(..., zorder=3)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接