python - 调用 pyplot.show() 后保存图形会导致空文件

标签 python matplotlib

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

最佳答案

如果您想在显示图形后保存它,则需要保留图形实例。调用showplt.savefig不起作用的原因是当前图形已被重置。

pyplot 跟踪哪些图形、轴等是“当前”的(即尚未使用 show 显示)。 gcfgca 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/

相关文章:

javascript - 在Django中,如何使选择下拉选项自动提交表单?

python - 参加 Python 类(class)并学习二分搜索,对为什么我的语义不正确感到困惑

某些 DELETE 请求的 Python BadStatusLine 错误

python - 如何关闭 Matplotlib 3D 散点图中的透明度?

python - 值在图中看不清楚

Windows 中的 Python 扭曲 OpenSSL 错误

python - 绘制 NetworkX Girvan-Newman 算法找到的社区的树状图

python - 当 x 轴不等距时,Matplotlib 不会连接数据点

matplotlib - 更改 View 、plot3D、Julia 语言(类似于 matplotlib)

python - matplotlib 子图中的 "SuperAxis"