奇怪的matplotlib zorder行为与图例和错误栏

时间:2013-05-27 09:22:33

标签: python matplotlib

我遇到了一个相当奇怪的图例行为和错误栏绘图命令。我使用Python xy 2.7.3.1和matplotlib 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()

得出这个情节:

error bar caps above scatter plot, plot line above legend

如您所见,错误栏上限正在覆盖散点图。如果我增加了足够的zorder,这不再发生,但是情节线会覆盖图例。我怀疑这个问题与matplotlib的this zorder problem有关。

快速,肮脏,骇客的解决方案也很受欢迎。

编辑(感谢@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),...正如您所正确建议的那样,仍会产生相同的图,误差条上限仍然高于散点图。我相应地纠正了上面的例子。

1 个答案:

答案 0 :(得分:3)

根据您发布的代码,创建的图表是正确的。 最低 zorder的对象位于底部,而最高 zorder的对象位于顶部。您链接到的zorder问题已在matplotlib 1.2.1版中修复,因此如果可能,您应该更新安装。

在您的第一个子图中,错误栏显示在散点图之上,因为使用errorbar调用zorder=2,而使用scatter调用zorder=1 - 意味着错误栏将叠加散点。

在您的第二个子图中,您使用errorbar调用了zorder=99scatter调用zorder=100plot调用zorder=101 - 意味着错误栏将放置在散点和线下面。

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

因此,为了产生您想要的输出,您必须相应地设置zorder参数。由于您未在问题中描述所需的输出,因此我很难纠正"你的代码,因为我不知道你想要绘制对象的顺序。