调用pyplot.show()后保存图形会产生一个空文件

时间:2014-02-19 08:53:47

标签: python matplotlib

以下示例代码生成一个简单的图,然后将其保存到'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')

4 个答案:

答案 0 :(得分:55)

如果要在显示后保存图形,则需要保持图形实例。调用plt.savefigshow无效的原因是当前数字已重置。

pyplot跟踪哪些数字,轴等在幕后是“当前”(即尚未与show一起显示)。 gcfgca分别获取当前的数字和当前轴实例。 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 modeshows all figures as they are drawn。这基本上消除了调用plt.show()的需要。您不再需要关闭数字即可继续。

要再次禁用交互模式,请致电plt.ioff()