Python 调用pyplot.show()后保存图形将导致一个空文件

Python 调用pyplot.show()后保存图形将导致一个空文件,python,matplotlib,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.sa

下面的示例代码生成一个简单的绘图,然后将其保存到“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')
在关闭时阻止并破坏情节。你可以用

plt.show(block=False)
之后,保存到fig2.pdf将起作用,或者您可以在保存之前再次打印它

plt.plot(x,y)
plt.savefig('fig2.pdf')
在关闭时阻止并破坏情节。你可以用

plt.show(block=False)
之后,保存到fig2.pdf将起作用,或者您可以在保存之前再次打印它

plt.plot(x,y)
plt.savefig('fig2.pdf')

如果要在显示地物后保存地物,则需要保留地物实例。调用
show
后,
plt.savefig
无法工作的原因是当前图形已重置

pyplot
跟踪哪些图形、轴等在幕后是“当前的”(即尚未使用
show
显示)
gcf
gca
g分别设置当前cfigure和当前axes实例
plt.savefig
(以及基本上任何其他
pyplot
方法)只执行
plt.gcf().savefig(…)
。换句话说,获取当前地物实例并调用其
savefig
方法。类似地,
plt.plot
基本上是
plt.gca().plot(…)

调用
show
后,“当前”图形和轴的列表为空

通常,最好直接使用figure和axes实例来打印/保存/显示/etc,而不是使用
plt.plot
等隐式获取当前图形/轴并在其上打印。使用
pyplot
处理任何事情都没有错(尤其是以交互方式),但它可以更容易地击中自己的脚

plt.show()
和使用
pyplot
生成地物和轴对象,然后直接使用地物或轴方法。(例如,
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
之前,只需抓取figure实例即可。例如:

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')

如果要在显示地物后保存地物,则需要保留地物实例。调用
show
后,
plt.savefig
无法工作的原因是当前图形已重置

pyplot
跟踪哪些图形、轴等在幕后是“当前的”(即尚未使用
show
显示)
gcf
gca
g分别设置当前cfigure和当前axes实例
plt.savefig
(以及基本上任何其他
pyplot
方法)只执行
plt.gcf().savefig(…)
。换句话说,获取当前地物实例并调用其
savefig
方法。类似地,
plt.plot
基本上是
plt.gca().plot(…)

调用
show
后,“当前”图形和轴的列表为空

通常,最好直接使用figure和axes实例来打印/保存/显示/etc,而不是使用
plt.plot
等隐式获取当前图形/轴并在其上打印。使用
pyplot
处理任何事情都没有错(尤其是以交互方式),但它可以更容易地击中自己的脚

plt.show()
和使用
pyplot
生成地物和轴对象,然后直接使用地物或轴方法。(例如,
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
之前,只需抓取figure实例即可。例如:

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')

我必须运行
plt.cla()
plt.clf()
才能绘制第二个。分别清除当前轴和当前绘图。

在绘制第二个轴之前,我必须运行
plt.cla()
plt.clf()
。分别清除当前轴和当前绘图。

如果您只想在保存前查看图形,可以调用

plt.ion()
在绘图之前,其中,和。这主要消除了调用
plt.show()
的需要。您不再需要关闭这些数字才能继续


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

如果您只想在保存前查看图形,可以调用

plt.ion()
在绘图之前,其中,和。这主要消除了调用
plt.show()
的需要。您不再需要关闭这些数字才能继续


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

这不是
block
所控制的,因为这是值得的<代码>块控制gui工具包的主循环是否会阻止进一步的执行或在单独的线程中运行。这不是
block
控制的,因为这是值得的<代码>块控制是否