Як мені сказати 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.