Как мне сказать 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()

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


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")

3
Вы все еще должны использовать plt.clf(), цифры хранятся в памяти, пока явно не закрыты
kaveish

13

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


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 без их повторной инициализации. Так что на графике тоже есть старые данные. Так что проверь это ..

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.