当前位置: 首页 > 面试题库 >

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

乐正乐湛
2023-03-14
问题内容

我遇到了图例和错误栏绘图命令的相当奇怪的行为。我将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()

这产生了这个情节:

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

如您所见,错误栏上限正在覆盖散点图。如果我增加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中修复,因此,如果可能,应更新安装。

在您的第一个子图中,误差线被绘制在散点上,因为用errorbar调用了zorder=2,而scatterzorder=1-调用了,这意味着误差线将覆盖散点。

在你的第二个插曲,你叫errorbarzorder=99scatterzorder=100plotzorder=101-这意味着errorbars将被放置在散点和线下两种。

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

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



 类似资料:
  • 我试图理解编译器在这里抱怨的原因: 使用编译时生成的消息 如下: cexpr_test.cpp:在函数 'int main()' 中: cexpr_test.cpp:12:76: error: 'const std::initializer_list{((const char* const*)( 令人困惑的是,为什么它会毫无问题地构造第一个初始值设定项列表。我在这里缺少什么?

  • 问题内容: 我正在使用此代码: 但是在编译时出现此错误: 然后是堆栈跟踪的编译器错误。 我将在课堂开始时同时进行这两种导入: 有什么事吗 在Netbeans中,我看到自动完成选项并且Locale对象没有语法错误… 问题答案: 您的设置有些麻烦,下面的程序对我来说很好用。 它要求源代码的事实使我相信它正在尝试以某种调试模式进行编译或运行。您不需要编译java.util。*的源代码,这很奇怪。 看看我

  • 问题内容: 给定一个数组,返回最后一个对象。例如: 在研究此问题时,除了这篇看似无关的SO帖子,我无法找到其他东西,这使我发现这是numpy中的一个公开错误(截至2015年3月):第一个报告和更相关的问题。发布此信息,以便其他人对此有所了解,可以更有效地找到此信息。 问题答案: 在版本,并表现为经典短路逻辑和/或功能。想到LISP行为。Python和运算符可以做到这一点。 一些例子: 返回逻辑上为

  • 我写了这个Django视图方法: 出于某种原因,第一个代码不起作用,但是如果我做了如下的小修改,它就会开始工作,我不知道为什么。 当我分析修改时: 和 它们看起来很相似,而且都是列表,里面有相同的信息。但是,当对其调用< code>json.dumps方法时,在第一段代码中,它会在浏览器上引发以下错误。

  • 我使用这个类在ImageView上绘制TriangleShapeView,它在用户单击事件时改变它的颜色和可绘制的图像。 在RecyclerView onBindViewHolder方法中,我检查,然后相应地设置TriangleShapeView颜色和可绘制图像: 在setOnClickListener中: 当项目第一次加载时,这可以正常工作,但当用户单击时: -第一个 我使用下面的xml布局来扩

  • 问题内容: 我目前正在开发一个纯粹的HTML和JavaScript驱动的Web应用程序,该应用程序使用CORS来使用远程Web服务,但目前在IE 11发出GET请求时遇到了麻烦。有趣的是,我们在IE8 / 9/10中可以正常运行,而不仅仅是11。 问题是IE 11似乎超时,而不是等待服务器的响应。ajax调用很简单: 在“网络”选项卡中,使用Fiddler,我可以看到IE从不发送请求。 请问有人有