【发布时间】:2013-05-27 09:22:33
【问题描述】:
我遇到了图例和错误栏绘图命令的一个相当奇怪的行为。我正在使用带有matplotlib 1.1.1的Python xy 2.7.3.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 增加得足够多,则不会再发生这种情况,但是情节线会覆盖图例。我怀疑这个问题与 this zorder problem 和 matplotlib 有关。
快速、肮脏、老套的解决方案也值得赞赏。
编辑(感谢@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参数。此外,您无需指定希望输出的外观,因此提供解决方案并非易事。 -
legend 没有 z 顺序,因此我不能给它这个论点。我将在问题中重新表述想要的结果,感谢您指出这一点。在左图中,误差线在散点图下方,但误差线上限在上方,这是错误的。在正确工作的正确图片上,但线在图例上方,这是无意的。
-
您可以使用
P.legend(loc="center").set_zorder(102)更改legend的zorder,使其在第二个子图中位于顶部。此外,在您上面的评论中,您说误差线位于散点图下方,这对我来说似乎不是这样,我怀疑它也不适合你。 t 是否使用大于 0.01 的yerr和xerr更容易查看。 -
另外,请参阅下面的答案,因为我解释了为什么你会得到你得到的输出。我正在使用 Python 2.7.5。和 matplotlib 1.2.1。
-
您上面链接的 zorder 问题在 matplotlib 1.2.1 中已修复,因此如果可能,您应该更新您的 matplotlib 以解决这些问题。
标签: python matplotlib