Як мені сказати 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
як точку стилю, немає необхідності використовувати subplot, коли у вас є лише один сюжет на фігуру.
Autoplectic

Відповіді:


124

Ви можете figure, наприклад, створити новий сюжет або використовувати closeпісля першого сюжету.


19
У підручнику pyplot згадується clf () у розділі "кілька фігур". Зауважте, що якщо ви просто створюєте новий сюжет з фігурою (), не закриваючи старий за допомогою close () (навіть якщо закриєте вікно графічного інтерфейсу), pyplot зберігає посилання на вашу стару фігуру, що може виглядати як витік пам'яті.
Джоні К. Сеппанен

5
Ви можете використовувати plt.close () / pylab.close (), щоб видалити всі старі фігури
Calvin1602

1
Після першого сюжету, ви маєте на увазі після plt.savefig("first.ps")?
Сігур

@ 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). FYI.
DJDuff

29

Як зазначає Девід Курно, використовуйте рисунок ().

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

Або subplot (121) / subplot (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(), цифри зберігаються в пам'яті, поки явно не закриються
кавеїш

13

Просто введіть plt.hold(False)перед першим plt.plot, і ви зможете дотримуватися свого початкового коду.


6
у matplotlib == 2.0.2, я отримую це повідомлення: MatplotlibDeprecationWarning: pyplot.hold застаріло.
Джонатан

12

Якщо ви використовуєте Matplotlib інтерактивно, наприклад у веб-програмі (наприклад, ipython), можливо, ви шукаєте

plt.show()

замість plt.close()або plt.clf().


Ви просто врятували мені купу часу, який мені не довелося втрачати
реабувати

1

Якщо жоден з них не працює, перевірте це, скажіть, чи є у вас масиви даних x і y вздовж відповідної осі. Потім перевірте, у якій комірці (jupyter) ви ініціалізували x та y, щоб випорожнити. Це тому, що, можливо, ви додаєте дані до x та y без повторної ініціалізації. Тож сюжет має і старі дані. Тож перевірте це ..

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.