使用Python的matplotlib选择哪些图形显示在屏幕上,哪些保存到文件中

11 投票
2 回答
6188 浏览
提问于 2025-04-16 18:09

我想在Python中使用 matplotlib.pyplot 创建不同的图形。然后,我希望将其中一些图形保存到文件中,而其他的则通过 show() 命令在屏幕上显示。

不过,show() 会显示我创建的 所有 图形。如果我不想在屏幕上显示某些图形,可以在创建这些图形后调用 close(),就像下面的代码一样:

import matplotlib.pyplot as plt

y1 = [4, 2, 7, 3]
y2 = [-7, 0, -1, -3]

plt.figure()
plt.plot(y1)
plt.savefig('figure1.png')
plt.close()

plt.figure()
plt.plot(y2)

plt.show()
plt.close('all')

这样可以保存第一个图形并显示第二个图形。但是,我收到了一个错误信息:

无法调用 "event" 命令:在执行时应用程序已被销毁

有没有更优雅的方法来选择显示哪些图形呢?

另外,第一个 figure() 命令是多余的吗?似乎无论我是否使用它,结果都没有什么不同。

非常感谢!

2 个回答

3

一般来说,你可以直接关闭图形。举个简单的例子:

import matplotlib.pyplot as plt

fig1 = plt.figure()
plt.plot(range(10), 'ro-')
plt.title('This figure will be saved but not shown')
fig1.savefig('fig1.png')
plt.close(fig1)

fig2 = plt.figure()
plt.plot(range(10), 'bo')
plt.title('This figure will be shown')

plt.show()

至于第一次调用 plt.figure() 是否多余,这要看你在做什么。通常情况下,你会想保留它返回的图形对象,然后用这个对象来操作,而不是使用 matplotlib 那种类似 MATLAB 的状态机接口。

当你制作更复杂的图表时,增加一行代码来做这样的事情通常是值得的:

fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.plot(range(10))

这样做的好处是,你不需要担心哪个图形或坐标轴是“活动”的,你只需引用特定的坐标轴或图形对象就可以了。

4

更好的方法是使用 plt.clf(),而不是 plt.close()。另外,plt.figure() 是用来创建一个新的图表,而你可以用 plt.clf() 来清空之前的图表:

import matplotlib.pyplot as plt

y1 = [4, 2, 7, 3]
y2 = [-7, 0, -1, -3]

plt.figure()
plt.plot(y1)
plt.savefig('figure1.png')
plt.clf()

plt.plot(y2)

plt.show()
plt.clf()

这段代码不会产生错误或警告,比如“无法调用‘事件’命令...”这样的提示。

撰写回答