2013-03-30 1 views
50

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

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

ответ

79

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

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

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

EDIT: Если вы не хотите потерять возможность отображения графики, выключите Interactive Mode и вызывать только 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 (fig) является ключевой командой для моей потребности. Я все еще не понимаю, как это повлияет на операцию; но, вероятно, я чего-то не вижу. Еще раз спасибо. – tnt

25

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

+0

лучшее решение! – PlagTag

+0

Лучшее решение! Я генерирую и сохраняю много графиков в цикле. С 'plt.ioff' я получаю' RuntimeWarning: открыто более 20 цифр ... '. 'plt.close' решил это. – Nagasaki45

Смежные вопросы