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


111

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

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


Ответ @staticfloat сработал для меня, даже когда я не в записной книжке, а при использовании matplotlib через JuliaLang; usingioff
Vass

Ответы:


174

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

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

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

РЕДАКТИРОВАТЬ: если вы не хотите терять возможность отображать графики, отключите интерактивный режим и звоните только 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?
tnt

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

3
Спасибо за отличный отзыв. Похоже, что команда plt.close (рис.) Является ключевой для меня. Я все еще не совсем понимаю ioff, поскольку он, похоже, не влияет на работу; но я, вероятно, что-то упускаю. Еще раз спасибо.
tnt 01

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

Для меня 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.