使用Matplotlib绘制带误差线的椭圆标记

4
我需要制作一个带有误差线的椭圆标记的图表。经过一番搜索,我发现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 S.
谢谢Jakob,但是由于我不是专业人士,您能指导我如何在两步内绘图吗? - makhlaghi
只需使用不同的设置两次调用“pylab.plot”命令。你能发布一些最小示例源代码吗? - Jakob S.
我刚刚添加了一个我想要做的简单案例。 - makhlaghi
2个回答

2

在您的绘图命令中使用 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”,它真的很有用。再次感谢。 - makhlaghi

0

Working with Path在我看来,使用Path是一种更直接的方法: Path实例被视为普通的marker,因此只需使用完全相同的接口即可。请查看下面的示例,但也参考matplotlib文档中关于此主题的内容。

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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接