以下示例代码生成一个简单的图,然后将其保存到'fig1.pdf',然后显示它,然后再将其保存到'fig2.pdf'。第一个图像看起来像预期的那样,但第二个图像是空白的(包含一个白色方块)。这里到底发生了什么?线plt.show()
显然有些混乱,但我无法弄清楚是什么/如何!
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-1, 1, 100)
y = x**2
plt.plot(x,y)
plt.savefig('fig1.pdf')
plt.show()
plt.savefig('fig2.pdf')
答案 0 :(得分:55)
如果要在显示后保存图形,则需要保持图形实例。调用plt.savefig
后show
无效的原因是当前数字已重置。
pyplot
跟踪哪些数字,轴等在幕后是“当前”(即尚未与show
一起显示)。 gcf
和gca
分别获取当前的数字和当前轴实例。 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')
答案 1 :(得分:3)
pyplot.show在关闭时阻止并破坏情节。你可以使用
plt.show(block=False)
之后保存到fig2.pdf将起作用,或者您可以在保存之前再次绘制
plt.plot(x,y)
plt.savefig('fig2.pdf')
答案 2 :(得分:1)
我必须在绘制第二个之前运行plt.cla()
和plt.clf()
。分别清除当前轴和清除电流图。
答案 3 :(得分:0)
如果您只想在保存之前查看该图,可以致电
plt.ion()
在绘制之前,其中starts interactive mode和shows all figures as they are drawn。这基本上消除了调用plt.show()
的需要。您不再需要关闭数字即可继续。
要再次禁用交互模式,请致电plt.ioff()
。