Звоню в пилаб.savefig без отображения в ipython


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

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

2 63

2 ответа:

Это вопрос 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()

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