以下示例代码生成一个简单的绘图,然后将其保存到“fig1.pdf”,然后显示它,然后再次将其保存到“fig2.pdf”。第一个图像看起来与预期一致,但第二个图像是空白的(包含白色方 block )。这里到底发生了什么? 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')
最佳答案
如果您想在显示图形后保存它,则需要保留图形实例。调用show
后plt.savefig
不起作用的原因是当前图形已被重置。
pyplot
跟踪哪些图形、轴等是“当前”的(即尚未使用 show
显示)。 gcf
和 gca
g设置c当前f图形和当前分别是 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 状态机的作用(尽管理解状态机接口(interface)也不难)。
作为“推荐”做事方式的示例,请执行以下操作:
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
接口(interface)来完成所有操作,那么只需在调用 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')
关于python - 调用 pyplot.show() 后保存图形会导致空文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60120982/