Виклик pylab.savefig без відображення в ipython


111

Мені потрібно створити фігуру у файлі, не відображаючи її в зошиті IPython. Мені не зрозуміло взаємодія між цим питанням IPythonі matplotlib.pylabв цьому плані. Але, коли я закликаю pylab.savefig("test.png")поточну цифру, вона відображається на додаток до збереження в test.png. При автоматизації створення великого набору файлів сюжетів це часто небажано. Або в тому випадку, якщо бажано проміжний файл для зовнішньої обробки іншим додатком.

Не впевнений, це питання matplotlibчи IPythonноутбук.


Відповідь @staticfloat працювала на мене навіть тоді, коли не в зошиті, а під час використання matplotlib через JuliaLang; користуванняioff
Vass

Відповіді:


173

Це питання щодо matplotlib, і ви можете його обійти, використовуючи бекенд, який не відображається користувачеві, наприклад, "Agg":

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt

plt.plot([1,2,3])
plt.savefig('/tmp/test.png')

EDIT: Якщо ви не хочете втрачати можливість відображення сюжетів, вимкніть інтерактивний режим і телефонуйте лише plt.show()тоді, коли ви готові відобразити сюжети:

import matplotlib.pyplot as plt

# Turn interactive plotting off
plt.ioff()

# Create a new figure, plot into it, then close it so it never gets displayed
fig = plt.figure()
plt.plot([1,2,3])
plt.savefig('/tmp/test0.png')
plt.close(fig)

# Create a new figure, plot into it, then don't close it so it does get displayed
plt.figure()
plt.plot([1,3,2])
plt.savefig('/tmp/test1.png')

# Display all "open" (non-closed) figures
plt.show()

2
Гаразд - але я хочу, як правило, зберегти вбудований сюжет в iPython. Те, що ви пропонуєте, працює чудово, якщо зробити повний перемикання на бекенд. Питання полягає в тому, як ви допускаєте загальну ситуацію встроєної графіки з винятковим випадком збереження фігур (не показуючи рядки). З вашої пропозиції я спробував перезавантажити модулі та змінити бекенд тимчасово, але без успіху. Будь-які ідеї, як тимчасово змінити бекенд протягом сеансу ноутбука iPython?
понеділок

1
Я оновив це питання, щоб поговорити про інтерактивне побудови графіків close()та show()команд та , які повинні вирішити вашу проблему. як ви виявили, зміна програмного забезпечення на ходу не підтримується.
staticfloat

3
Дякую за чудові відгуки. Здається, що plt.close (fig) є ключовою командою для моєї потреби. Мені досі не зрозуміло йоф, оскільки, здається, це не впливає на операцію; але, я, мабуть, чогось пропускаю. Знову дякую.
Tnt

1
Рецепт, який я дав, є загальним; якщо ви не працюєте в зошиті ipython, plt.ioff () важливо, щоб цифри не мерехтіли на екрані та вимикалися, оскільки в командному рядку фігури ipython будуються, як тільки ви телефонуєте, plt.plot()якщо інтерактивний режим увімкнено. Вимкнення інтерактивного режиму затримує показ будь-яких сюжетів доти plt.show(). Оскільки ви використовуєте ноутбук ipython, інтерактивний режим трактується по-різному.
staticfloat

Для мене matplotlib.use('Agg')один зробив трюк. Мені взагалі не знадобився жоден plt.show()або plt.ioff()в моєму коді.
Zhanwen Chen

67

Нам не потрібно plt.ioff()або plt.show()(якщо ми використовуємо %matplotlib inline). Ви можете перевірити код вище без plt.ioff(). plt.close()відіграє істотну роль. Спробуйте це:

%matplotlib inline
import pylab as plt

# It doesn't matter you add line below. You can even replace it by 'plt.ion()', but you will see no changes.
## plt.ioff()

# Create a new figure, plot into it, then close it so it never gets displayed
fig = plt.figure()
plt.plot([1,2,3])
plt.savefig('test0.png')
plt.close(fig)

# Create a new figure, plot into it, then don't close it so it does get displayed
fig2 = plt.figure()
plt.plot([1,3,2])
plt.savefig('test1.png')

Якщо ви запустите цей код в iPython, він відобразить другий сюжет, і якщо додати plt.close(fig2)його до кінця, ви нічого не побачите.

На закінчення, якщо ви закриєте фігуру на plt.close(fig), вона не відображатиметься.


5
Краще рішення! Я генерую і зберігаю багато сюжетів у циклі. З plt.ioffя отримую RuntimeWarning: More than 20 figures have been opened.... plt.closeвирішили це.
Nagasaki45
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.