Вызов pylab.savefig без отображения в ipython
Мне нужно создать фигуру в файле, не отображая ее в ноутбуке IPython. В этом отношении я не понимаю взаимодействия между IPython
и matplotlib.pylab
. Но, когда я вызываю pylab.savefig("test.png")
, текущий показатель отображается в дополнение к сохранению в test.png
. При автоматизации создания большого набора файлов сюжетов это часто нежелательно. Или в ситуации, когда требуется промежуточный файл для внешней обработки другим приложением.
Не уверен, что это вопрос с записью matplotlib
или IPython
.
Ответы
Ответ 1
Это вопрос 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
Нам не нужно 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)
, она не будет отображаться.