我遇到了图例和错误栏绘图命令的相当奇怪的行为。我将Python xy 2.7.3.1与matplotlib 1.1.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()
这产生了这个情节:
如您所见,错误栏上限正在覆盖散点图。如果我增加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)
根据您发布的代码,创建的图是正确的。 最低 的对象zorder放在底部,而 最高 的对象zorder放在顶部。您链接到的zorder问题已在matplotlib版本1.2.1中修复,因此,如果可能,应更新安装。
zorder
在您的第一个子图中,误差线被绘制在散点上,因为用errorbar调用了zorder=2,而scatter用zorder=1-调用了,这意味着误差线将覆盖散点。
errorbar
zorder=2
scatter
zorder=1
在你的第二个插曲,你叫errorbar用zorder=99,scatter用zorder=100而plot用zorder=101-这意味着errorbars将被放置在散点和线下两种。
zorder=99
zorder=100
plot
zorder=101
之所以legend在第一个子图中的行顶部显示它,而在第二个子图中的同一行顶部显示它,是因为您没有显式设置图例objectazorder值,这意味着它将使用它的默认值(我相信是5)。要更改图例的zorder,只需使用P.legend(loc="center").set_zorder(102)102是所需的zorder值。
legend
P.legend(loc="center").set_zorder(102)
因此,为了产生所需的输出,必须相应地设置zorder参数。由于您尚未在问题中描述 所需的 输出,因此我很难“更正”您的代码,因为我不知道您希望以什么顺序绘制对象。