带有legend和errorb的奇怪matplotlib zorder行为

2024-04-25 08:41:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我遇到了一个相当奇怪的legend行为和errorbar plot命令。我正在使用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)。。。正如您正确建议的那样,仍然会生成相同的绘图,错误条形图的大写部分仍然位于散点上方。我相应地更正了上面的例子。

Tags: importplotmatplotlibaslabelx1x2legend
1条回答
网友
1楼 · 发布于 2024-04-25 08:41:57

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

在第一个子块中,错误条标绘在散布点的顶部,因为errorbar是用zorder=2调用的,而scatter是用zorder=1调用的,这意味着错误条将覆盖散布点。

在您的第二个子块中,您用zorder=99调用errorbar,用zorder=100调用scatter,用zorder=101调用plot,这意味着误差条将放在散点和线的下面。

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

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

相关问题 更多 >

    热门问题