4

我遇到了一个相当奇怪的图例行为和错误栏绘图命令。我正在使用 Python xy 2.7.3.1matplotlib 1.1.1 下面的代码举例说明了观察到的行为:

import pylab as P
import numpy as N

x1=N.linspace(0,6,10)
y1=N.sin(x1)
x2=N.linspace(0,6,5000)
y2=N.sin(x2)
xerr = N.repeat(0.01,10)
yerr = N.repeat(0.01,10)

#error bar caps visible in scatter dots
P.figure()
P.subplot(121)
P.title("strange error bar caps")
P.scatter(x1,y1,s=100,c="k",zorder=1)
P.errorbar(x1,y1,yerr=yerr,xerr=xerr,color="0.7", 
    ecolor="0.7",fmt=None, zorder=0)
P.plot(x2,y2,label="a label")
P.legend(loc="center")

P.subplot(122)
P.title("strange legend behaviour")
P.scatter(x1,y1,s=100,c="k",zorder=100)
P.errorbar(x1,y1,yerr=yerr,xerr=xerr,color="0.7", 
    ecolor="0.7",fmt=None, zorder=99)
P.plot(x2,y2,label="a label", zorder=101)
P.legend(loc="center")
P.show()

这产生了这个情节:

散点图上方的误差线上限,图例上方的绘图线

如您所见,误差条上限正在覆盖散点图。如果我将 zorder 增加得足够多,则不会再发生这种情况,但是情节线会覆盖图例。我怀疑这个问题与 matplotlib的zorder 问题有关。

快速,肮脏,hacky的解决方案也受到赞赏。

编辑(感谢@nordev):期望的结果如下:

  • 误差线以及结束大写应位于散点图点下方。
  • 线图应高于散点和误差线
  • 传奇应高于一切

根据您的答案调整 zorder:

  • P.legend(zorder=100) -->self.legend_ = mlegend.Legend(self, handles, labels, **kwargs) TypeError: __init__() got an unexpected keyword argument 'zorder'
  • P.errorbar(zorder=0), P.scatter(zorder=1), ... 正如您正确建议的那样,仍然会产生相同的图,误差条上限仍在散点上方。我相应地更正了上面的例子。
4

1 回答 1

6

根据您发布的代码,创建的图是正确的。最低 的物体zorder放在底部,而最高 zorder的物体放在上面。您链接到的 zorder 问题已在 matplotlib 版本 1.2.1 中修复,因此您应该尽可能更新安装。

在您的第一个子图中,误差条绘制在散点上方,因为errorbar使用 调用zorder=2,而scatter使用调用zorder=1- 意味着误差条将覆盖散点。

在您的第二个子图中,您调用errorbar了 with zorder=99scatterwithzorder=100plotwith zorder=101- ,这意味着误差线将放置在散点和线的下方。

之所以legend显示在第一个子图中的行顶部,而它在第二个子图中位于同一行的顶部,是因为您没有明确设置图例对象zorder值,这意味着它将使用它的默认值(我相信是 5)。要更改图例 zorder,只需使用P.legend(loc="center").set_zorder(102)where 102 是所需的 zorder 值。

因此,为了产生您想要的输出,您必须zorder相应地设置参数。由于您没有在问题中描述您想要的输出,因此我很难“纠正”您的代码,因为我不知道您希望以哪种顺序绘制对象。

于 2013-05-27T10:13:17.027 回答