【问题标题】:making ellipse markers with error bars matplotlib使用误差线 matplotlib 制作椭圆标记
【发布时间】:2019-06-14 20:10:15
【问题描述】:

我需要用椭圆作为标记绘制一个图(带有误差线)。经过一番搜索,我在matplotlib.patches 中找到了Ellipse。然后我可以用plt.errorbar 绘制误差线。但问题是,即使我先给出错误栏命令,无论我在程序中给出什么顺序,错误栏总是在前景中绘制,而椭圆则在背景中绘制。

有没有人知道一种更好的方法来创建一个带有误差线的椭圆作为标记(每个点都有不同的偏心率)?或者至少指导我如何将误差线放在后台?

这是我目前所拥有的一个最小示例:

import matplotlib.pyplot as plt
from matplotlib.backends.backend_pdf import PdfPages
from matplotlib.patches import Ellipse

PlotFileName="test.pdf"
pdf = PdfPages(PlotFileName)
fig=plt.figure(1)
ax1=fig.add_subplot(111)
plt.xlim([1,4])
plt.ylim([2,8])
ax1.errorbar([2.5], [5], yerr=[1], fmt="o", color="black", ms=0.1)
ax1.add_artist(Ellipse((2.5, 5), 1, 1, facecolor="green", edgecolor="black"))
pdf.savefig(fig)
pdf.close()
plt.close()

这是它的外观:

我希望误差线出现在椭圆的背景中。

提前谢谢...

【问题讨论】:

  • 我只是在猜测,但是您能否尝试分两步进行绘图:首先仅绘制误差线(即,使用误差线和某种空或最小标记绘制数据)然后绘制带有椭圆作为标记但没有误差线的相同数据(您已经在后台绘制)?
  • 谢谢 Jakob,但由于我不是专业人士,您能指导我如何分两步进行绘图吗?
  • 只需使用不同的设置两次调用“pylab.plot”命令。你能发布一些最小的示例源代码吗?
  • 我只是添加了一个我想做的简单案例。

标签: python matplotlib


【解决方案1】:

为您的两个绘图命令使用zorder 说明符。 来自文档:“为艺术家设置 zorder。首先绘制 zorder 值较低的艺术家。”

import matplotlib.pyplot as plt
from matplotlib.patches import Ellipse

fig=plt.figure(1)
ax1=fig.add_subplot(111)
plt.xlim([0,5])
plt.ylim([0,10])
ax1.errorbar([2.5], [5], yerr=[1], fmt="o", color="black", ms=0.1, zorder=1)
ax1.add_artist(Ellipse((2.5, 5), 1, 1, facecolor="green", edgecolor="black",zorder=2))

plt.show()

exit(0)

【讨论】:

  • 非常感谢!它工作得很好。我不知道“zorder”,它真的很有用。再次感谢。
【解决方案2】:

在我看来,使用Path 是一种更直接的方法:Path 实例被完全视为普通的marker,因此只需使用相同的接口。请看下面的例子,也可以参考matplotlib documentation这个话题。

import numpy as np

import matplotlib.pyplot as plt 
import matplotlib.path as mpath

# Create mock data.
theta = np.linspace(0, 2.*np.pi, 30) 
signa = np.sin(theta)

u_theta = np.random.normal(0., scale=0.15, size=signa.size)
u_signa = np.random.normal(0., scale=0.15, size=signa.size)

theta += u_theta
signa += u_signa

# Define the ellipse marker.
circle = mpath.Path.unit_circle()
verts = np.copy(circle.vertices)
verts[:, 0] *= 1.618
ellipt_marker = mpath.Path(verts, circle.codes)

# Done, basically.[![Plotting example][1]][1]
plt.errorbar(theta, signa, xerr=u_theta, yerr=u_signa,
             marker=ellipt_marker, linestyle='', capsize=5,
             ms=20, mfc='w', c='r', mec='g')

plt.xlabel('Autology', fontsize=35)
plt.ylabel('Eterology', fontsize=35)
plt.show()

【讨论】:

    猜你喜欢
    • 2013-11-14
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多