使用matplotlib,我试图在图形关闭时执行回调函数,重绘图形图例。但是,当我调用ax.legend()时,它似乎阻止了正在执行的任何其他代码。所以在下面的代码中,'之后'永远不会打印。
有人可以解释为什么会这样吗?我可以在legend()调用之后运行代码,但在数字关闭之前?最终目标是在关闭时保存两个不同版本的图形,在两次保存之间重新绘制图例。谢谢。
from __future__ import print_function
import matplotlib.pyplot as plt
def handle_close(evt):
f = evt.canvas.figure
print('Figure {0} closing'.format(f.get_label()))
ax = f.get_axes()
print('before')
leg = ax.legend() # This line causes a problem
print('after') # This line (and later) is not executed
xs = range(0, 10, 1)
ys = [x*x for x in xs]
zs = [3*x for x in xs]
fig = plt.figure('red and blue')
ax = fig.add_subplot(111)
ax.plot(xs, ys, 'b-', label='blue plot')
ax.plot(xs, zs, 'r-', label='red plot')
fig.canvas.mpl_connect('close_event', handle_close)
ax.legend()
plt.show()
答案 0 :(得分:0)
好的,对不起,我已经弄清楚了。 f.get_axes()
会返回轴对象的列表。因此,后来对ax.legend()
的调用无效。
更改为以下行可解决问题:
axs = f.get_axes()
for ax in axs:
leg = ax.legend()
我仍然不确定为什么这不会产生某种解释器错误。