Вызов pylab.savefig без отображения в ipython

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

Не уверен, относится ли это к блокноту matplotlib или IPython.


person tnt    schedule 30.03.2013    source источник
comment
Ответ @staticfloat сработал для меня, даже если он не в блокноте и при использовании matplotlib через JuliaLang; используя ioff   -  person Vass    schedule 21.05.2019


Ответы (2)


Это вопрос matplotlib, и вы можете обойти это, используя бэкэнд, который не отображается пользователю, например. «Агг»:

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()
person staticfloat    schedule 30.03.2013
comment
Хорошо, но я хочу сохранить встроенный график в iPython. То, что вы предлагаете, отлично работает, если полностью переключиться на серверную часть. Вопрос в том, как вы учитываете общую ситуацию встроенного графика с исключительным случаем сохранения цифр (без отображения встроенного). По вашему предложению я попытался перезагрузить модули и временно изменить бэкэнд, но безуспешно. Любые идеи о том, как временно изменить бэкэнд в сеансе ноутбука iPython? - person tnt; 30.03.2013
comment
Я обновил вопрос, чтобы рассказать об интерактивном построении графиков и командах close() и show(), которые должны решить вашу проблему. изменение бэкэндов на лету не поддерживается, как вы обнаружили. - person staticfloat; 30.03.2013
comment
Спасибо за отличный отзыв. Кажется, что plt.close(fig) является ключевой командой для моих нужд. Я до сих пор не понимаю, что такое ioff, так как это, похоже, не влияет на работу; но, наверное, я что-то упускаю. Спасибо еще раз. - person tnt; 01.04.2013
comment
Рецепт, который я дал, является общим; если вы не работаете в блокноте ipython, функция plt.ioff() важна для предотвращения мерцания фигур на экране и за его пределами, так как в командной строке цифры ipython отображаются, как только вы вызываете plt.plot(), если интерактивный режим включен. Выключение интерактивного режима задерживает отображение любых графиков до plt.show(). Поскольку вы используете блокнот ipython, интерактивный режим обрабатывается по-другому. - person staticfloat; 01.04.2013
comment
Для меня только matplotlib.use('Agg') сделал свое дело. Мне вообще не нужны были plt.show() или plt.ioff() в моем коде. - person Zhanwen Chen; 16.09.2019
comment
как вернуться к стандартному бэкенду после использования 'Agg'? - person Gulzar; 17.12.2020

Нам не нужно 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), он не будет отображаться.

person Mojtaba Khodadadi    schedule 06.08.2015
comment
Действительно лучшее решение! Я генерирую и сохраняю множество графиков в цикле. С plt.ioff я получаю RuntimeWarning: More than 20 figures have been opened.... plt.close решил. - person Nagasaki45; 19.07.2017
comment
plt.close(fig) сделал это для меня спасибо - person Ahmad Asmndr; 03.06.2021