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