我跟随
Tong 提供的链接学习了一下,发现他的代码存在问题 - 不需要输入
self变量。同时,
mitpre 提供了一个更通用的解决方案 - 我使用它效果很好。以下是代码以便快速参考:
def update_errorbar(errobj, x, y, xerr=None, yerr=None):
ln, caps, bars = errobj
if len(bars) == 2:
assert xerr is not None and yerr is not None, "Your errorbar object has 2 dimension of error bars defined. You must provide xerr and yerr."
barsx, barsy = bars
try:
errx_top, errx_bot, erry_top, erry_bot = caps
except ValueError:
pass
elif len(bars) == 1:
assert (xerr is None and yerr is not None) or\
(xerr is not None and yerr is None), \
"Your errorbar object has 1 dimension of error bars defined. You must provide xerr or yerr."
if xerr is not None:
barsx, = bars
try:
errx_top, errx_bot = caps
except ValueError:
pass
else:
barsy, = bars
try:
erry_top, erry_bot = caps
except ValueError:
pass
ln.set_data(x,y)
try:
errx_top.set_xdata(x + xerr)
errx_bot.set_xdata(x - xerr)
errx_top.set_ydata(y)
errx_bot.set_ydata(y)
except NameError:
pass
try:
barsx.set_segments([np.array([[xt, y], [xb, y]]) for xt, xb, y in zip(x + xerr, x - xerr, y)])
except NameError:
pass
try:
erry_top.set_xdata(x)
erry_bot.set_xdata(x)
erry_top.set_ydata(y + yerr)
erry_bot.set_ydata(y - yerr)
except NameError:
pass
try:
barsy.set_segments([np.array([[x, yt], [x, yb]]) for x, yt, yb in zip(x, y + yerr, y - yerr)])
except NameError:
pass
ErrorbarContainer
对象的.lines
属性访问构成图形的行,该属性会提供一个元组(xyline, caplines, errorbarlines)
。调用xyline.set_data()
足够简单。尴尬的是,您需要手动计算每个caplines
的新xy
位置。对于errorbarlines
,您也需要做同样的事情,由于它们是LineCollection
的元组,因此需要向.set_segments()
方法传递一个序列(x0,y0),(x1,y1),...,(xm,ym)
。 - ali_m