Как мне сказать matplotlib, что я закончил с сюжетом?

166

Следующий код отображает два файла 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

Ответы:

124

Вы можете использовать figure, например, для создания нового графика, или использовать closeпосле первого графика.

Дэвид Курнапо
источник
19
В руководстве по pyplot упоминается clf () в разделе «Несколько цифр». Обратите внимание, что если вы просто создаете новый график с figure (), не закрывая старый с помощью close () (даже если вы закрываете окно GUI), pyplot сохраняет ссылку на ваш старый рисунок, который может выглядеть как утечка памяти.
Джоуни К. Сеппанен
5
Вы можете использовать plt.close () / pylab.close (), чтобы удалить все старые цифры
Calvin1602
1
После первого сюжета, ты имеешь в виду после plt.savefig("first.ps")?
Сигур
@ JouniK.Seppänen Просто чтобы добавить к вашему комментарию, Python по умолчанию предупредит вас, если вы откроете много фигур: «RuntimeWarning: открыто более 20 цифр».
18.5
173

Существует четкая команда, и она должна сделать это за вас:

plt.clf()

Если у вас есть несколько участков на одном рисунке

plt.cla()

очищает текущие оси.

randlet
источник
1
Спасибо! Если вы используете бэкэнд PDF (который позволяет сохранять несколько графиков), вам нужно будет вызывать его после каждого вызова plt.save ()
Бен ДеМотт,
4
В моем случае plt.clf () было достаточно, чтобы очистить рисунок, но недостаточно, чтобы остановить утечки памяти, но первый вызов plt.close () остановил утечку памяти. Python 2.7, matplotlib 1.1.1rc1 (ubuntu 12.04). FYI.
DJDuff
29

Как сказано у Дэвида Курнапо, используйте 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")
lmount
источник
3
Вы все еще должны использовать plt.clf(), цифры хранятся в памяти, пока явно не закрыты
kaveish
13

Просто введите plt.hold(False)перед первым plt.plot, и вы можете придерживаться своего исходного кода.

Dirklinux
источник
6
в matplotlib == 2.0.2 я получаю это сообщение: MatplotlibDeprecationWarning: pyplot.hold устарела.
Джонатан
12

Если вы используете Matplotlib в интерактивном режиме, например, в веб-приложении (например, ipython), которое вы, возможно, ищете

plt.show()

вместо plt.close()или plt.clf().

Дамо
источник
Вы просто сэкономили мне кучу времени, которое я не должен был потерять
reabow
1

Если ни один из них не работает, проверьте это .. скажем, если у вас есть массивы данных x и y вдоль соответствующей оси. Затем проверьте, в какой ячейке (jupyter) вы инициализировали x и y для очистки. Это потому, что, возможно, вы добавляете данные к x и y без их повторной инициализации. Так что на графике тоже есть старые данные. Так что проверь это ..

Seenivasan
источник