如果要在显示后保存图形,则需要保留图形实例。调用show后plt.savefig不起作用的原因是当前的数字已经被重置了。
pyplot 在幕后跟踪哪些图形、轴等是“当前的”(即尚未与show 一起显示)。 gcf 和 gca get c当前 figure 和当前 axes 实例。 plt.savefig(以及基本上任何其他pyplot 方法)只是做plt.gcf().savefig(...)。换句话说,获取当前图形实例并调用其savefig 方法。同样plt.plot 基本上是plt.gca().plot(...)。
在调用show 后,“当前”图形和轴的列表为空。
一般来说,最好直接使用图形和轴实例来绘制/保存/显示/等,而不是使用plt.plot 等来隐式获取当前图形/轴并在其上绘制。对所有事情都使用pyplot 没有任何问题(尤其是交互方式),但它更容易让自己在脚下开枪。
将pyplot 用于plt.show() 并生成图形和坐标区对象,然后直接使用图形或坐标区方法。 (例如 ax.plot(x, y) 而不是 plt.plot(x, y) 等)这样做的主要优点是它是明确的。您知道要绘制的对象是什么,并且不必推理 pyplot 状态机的作用(尽管理解状态机接口也不是那么难)。
作为“推荐”做事方式的示例,请执行以下操作:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-1, 1, 100)
y = x**2
fig, ax = plt.subplots()
ax.plot(x, y)
fig.savefig('fig1.pdf')
plt.show()
fig.savefig('fig2.pdf')
如果您更愿意使用pyplot 接口来处理所有事情,那么只需在调用show 之前获取图形实例即可。例如:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-1, 1, 100)
y = x**2
plt.plot(x, y)
fig = plt.gcf()
fig.savefig('fig1.pdf')
plt.show()
fig.savefig('fig2.pdf')