如何告诉matplotlib我已经完成了情节?


165

下面的代码绘制到两个PostScript(.ps)文件,但是第二个包含这两行。

import matplotlib
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab

plt.subplot(111)
x = [1,10]
y = [30, 1000]
plt.loglog(x, y, basex=10, basey=10, ls="-")
plt.savefig("first.ps")


plt.subplot(111)
x = [10,100]
y = [10, 10000]
plt.loglog(x, y, basex=10, basey=10, ls="-")
plt.savefig("second.ps")

如何告诉matplotlib重新开始第二个绘图?


3
作为一种样式,当每个图形只有一个图形时,就不需要使用子图形。
Autoplectic

Answers:


123

figure例如,您可以用于创建新图,或者close在第一个图之后使用。


19
pyplot教程在“多个图形”部分中确实提到了clf()。请注意,如果仅使用figure()创建新图而不用close()关闭旧图(即使关闭GUI窗口),则pyplot会保留对旧图的引用,这看起来像是内存泄漏。
Jouni K.Seppänen09年

5
您可以使用plt.close()/ pylab.close()删除所有旧数字
Calvin1602,2013年

1
在第一次情节之后,您是说之后plt.savefig("first.ps")吗?
Sigur

@JouniK.Seppänen仅添加您的评论,如果您打开许多数字,Python默认会警告您:“ RuntimeWarning:已打开20多个数字。”。
rph

173

有一个清晰的图形命令,它应该为您完成:

plt.clf()

如果同一图中有多个子图

plt.cla()

清除当前轴。


1
谢谢!如果您使用的是PDF后端(它允许你保存多个地块),就需要在每次通话后称这plt.save()
本·德莫特

4
就我而言,plt.clf()足以清除图形,但不足以阻止内存泄漏,但是首先调用plt.close()可以停止内存泄漏。Python 2.7,matplotlib 1.1.1rc1(ubuntu 12.04)。仅供参考。
DJDuff

29

如David Cournapeau所述,使用Figure()。

import matplotlib
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab

plt.figure()
x = [1,10]
y = [30, 1000]
plt.loglog(x, y, basex=10, basey=10, ls="-")
plt.savefig("first.ps")


plt.figure()
x = [10,100]
y = [10, 10000]
plt.loglog(x, y, basex=10, basey=10, ls="-")
plt.savefig("second.ps")

或子图(121)/子图(122)用于相同图,不同位置。

import matplotlib
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab

plt.subplot(121)
x = [1,10]
y = [30, 1000]
plt.loglog(x, y, basex=10, basey=10, ls="-")

plt.subplot(122)
x = [10,100]
y = [10, 10000]
plt.loglog(x, y, basex=10, basey=10, ls="-")
plt.savefig("second.ps")

3
您仍应使用plt.clf(),数字将一直保存在内存中,直到明确关闭为止
kaveish

13

只要plt.hold(False)在第一个plt.plot之前输入,就可以坚持原始代码。


6
在matplotlib == 2.0.2中,我收到以下消息:MatplotlibDeprecationWarning:pyplot.hold已过时。
乔纳森

12

如果您以交互方式使用Matplotlib,例如在Web应用程序(例如ipython)中,则可能需要寻找

plt.show()

代替plt.close()plt.clf()


您为我节省了很多时间,我不必失去
重生

1

如果它们都不起作用,则检查此..说您是否沿各自的轴具有x和y数据数组。然后检查在哪个单元格(jupyter)中将x和y初始化为空。这是因为,也许您是将数据附加到x和y而不重新初始化它们。因此,情节也有旧数据。所以检查一下。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.