Я пишу быстрый и грязный скрипт для создания графиков на лету. Я использую код ниже (из документации Matplotlib ) в качестве отправной точки:
from pylab import figure, axes, pie, title, show
# Make a square figure and axes
figure(1, figsize=(6, 6))
ax = axes([0.1, 0.1, 0.8, 0.8])
labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
fracs = [15, 30, 45, 10]
explode = (0, 0.05, 0, 0)
pie(fracs, explode=explode, labels=labels, autopct='%1.1f%%', shadow=True)
title('Raining Hogs and Dogs', bbox={'facecolor': '0.8', 'pad': 5})
show() # Actually, don't show, just save to foo.png
Я не хочу отображать график в графическом интерфейсе, вместо этого я хочу сохранить график в файл (скажем, foo.png), чтобы, например, его можно было использовать в пакетных сценариях. Как я могу это сделать?
python
matplotlib
plot
Homunculus Reticulli
источник
источник
savefig
метод. Так что вы можете позвонитьfig = plt.figure()
тогдаfig.savefig(...)
.plt.close(fig)
что особенно важно в больших циклах. В противном случае фигуры остаются открытыми и ожидающими в памяти, и все открытые фигуры будут показаны после выполненияplt.show()
Ответы:
Хотя на вопрос дан ответ, я хотел бы добавить несколько полезных советов при использовании matplotlib.pyplot.savefig . Формат файла может быть указан расширением:
Даст растеризованный или векторизованный вывод соответственно, оба могут быть полезны. Кроме того, вы обнаружите, что
pylab
вокруг изображения остаются большие, часто нежелательные, пробелы. Удалите это с:источник
plt.savefig
вы можете изменить dpi, смотрите ссылку в ответе. Размеры можно управлять при создании фигуры смfigsize
в matplotlib.org/api/figure_api.html#matplotlib.figure.Figureplt.ioff()
который должен отключить интерактивность вmatplotlib.pyplot
командах.foo.png
это путь. Вы можете, например, поместить его в такой каталогsavefig("mydir/foo.png")
.Как уже говорили другие,
plt.savefig()
илиfig1.savefig()
это действительно способ сохранить изображение.Однако я обнаружил, что в некоторых случаях эта цифра всегда отображается . (Например, если Spyder имеет
plt.ion()
: interactive mode = On.) Я работаю над этим, заставляя закрывать окно рисунка в моем гигантском цикле с помощьюplt.close(figure_object)
(см. документацию ), чтобы у меня не было миллиона открытых фигур во время цикла:Вы должны быть в состоянии повторно открыть фигуру позже, если это необходимо
fig.show()
(не проверял себя).источник
plt.ioff() # turn of interactive plotting mode
, но это может отключить поведение, которое вы захотите использовать, если ваш код завершится с ошибкой.plt.close(fig)
решилРешение:
источник
Только что нашел эту ссылку в документации MatPlotLib, касающейся именно этой проблемы: http://matplotlib.org/faq/howto_faq.html#generate-images-without-having-a-window-appear
Они говорят, что самый простой способ предотвратить появление фигуры - это использовать неинтерактивный бэкэнд (например, Agg)
matplotib.use(<backend>)
, например , с помощью :Я все еще лично предпочитаю использовать
plt.close( fig )
, поскольку у вас есть возможность скрыть определенные цифры (во время цикла), но по-прежнему отображать цифры для обработки данных после цикла. Это, вероятно, медленнее, чем выбор неинтерактивного бэкэнда - было бы интересно, если бы кто-нибудь это проверил.ОБНОВЛЕНИЕ : для Spyder, вы обычно не можете установить бэкэнд таким образом (потому что Spyder обычно загружает matplotlib рано, мешая вам использовать
matplotlib.use()
).Вместо этого используйте
plt.switch_backend('Agg')
или отключите « включить поддержку » в настройках Spyder и выполнитеmatplotlib.use('Agg')
команду самостоятельно.Из этих двух подсказок: один , два
источник
.plot()
выдаст ошибку, еслиos.environ['DISPLAY']
она не установлена правильно.Если вам не нравится понятие «текущая» фигура, сделайте:
источник
src.png
вout.png
?img
), вы можете сохранить его в файле с.imsave()
методом.Другие ответы верны. Однако иногда я обнаруживаю, что хочу открыть объект рисунка позже. Например, я мог бы хотеть изменить размеры этикетки, добавить сетку или сделать другую обработку. В идеальном мире я бы просто перезапустил код, генерирующий сюжет, и изменил настройки. Увы, мир не идеален. Поэтому, помимо сохранения в PDF или PNG, я добавляю:
Таким образом, позже я могу загрузить объект рисунка и манипулировать настройками по своему усмотрению.
Я также выписываю стек с исходным кодом и
locals()
словарем для каждой функции / метода в стеке, чтобы позже я мог точно сказать, что породило фигуру.NB: будьте осторожны, так как иногда этот метод генерирует огромные файлы.
источник
источник
После использования plot () и других функций для создания содержимого, которое вы хотите, вы можете использовать такое предложение, чтобы выбирать между выводом на экран или в файл:
источник
fig = plt.figure(figuresize=4, 5)
может бытьfig = plt.figure(figsize=(4, 5)) #figure sizes in inches
Я использовал следующее:
Я нашел очень важным использовать plt.show после сохранения рисунка, иначе он не будет работать.фигура экспортируется в PNG
источник
f= plt.savefig('data.png')
Вы можете сделать:
и не забудьте позволить savefig закончить перед закрытием графика GUI. Таким образом, вы можете увидеть изображение заранее.
В качестве альтернативы, вы можете посмотреть на это,
plt.show()
затем закройте GUI и снова запустите скрипт, но на этот раз заменитеplt.show()
наplt.savefig()
.Кроме того, вы можете использовать
источник
Если, как и я, вы используете Spyder IDE, вам необходимо отключить интерактивный режим с помощью:
plt.ioff()
(эта команда автоматически запускается при научном запуске)
Если вы хотите включить его снова, используйте:
plt.ion()
источник
Решение :
Если вы хотите отобразить изображение, а также сохранить изображение, используйте:
после
import matplotlib
источник
В соответствии с вопросом Matplotlib (pyplot) savefig выводит пустое изображение .
Следует отметить одну вещь: если вы используете,
plt.show
и он должен послеplt.savefig
, или вы дадите пустое изображение.Подробный пример:
источник
В Jupyter Notebook вы должны удалить
plt.show()
и добавитьplt.savefig()
вместе с остальной частью plt-код в одну ячейку. Изображение все равно будет отображаться в вашем блокноте.источник
Учитывая, что сегодня (не было доступно, когда этот вопрос был задан) многие люди используют Jupyter Notebook в качестве консоли Python, существует чрезвычайно простой способ сохранить графики как
.png
, просто вызовите классmatplotlib
'spylab
из Jupyter Notebook, нанесите фигуру на линию 'jupyter ячейки, а затем перетащите эту фигуру / изображение в локальный каталог. Не забудьте%matplotlib inline
в первой строке!источник
В дополнение к вышеперечисленному я добавил
__file__
имя, чтобы изображение и файл Python имели одинаковые имена. Я также добавил несколько аргументов, чтобы он выглядел лучше:источник
При использовании
matplotlib.pyplot
вы должны сначала сохранить свой график, а затем закрыть его, используя следующие 2 строки:источник
Как предлагалось ранее, вы можете использовать:
Для сохранения любого изображения IPhython, которое вы отображаете. Или на другой ноте (если смотреть под другим углом), если вам когда-нибудь придется работать с open cv или если вы импортировали open cv, вы можете перейти к:
импорт cv2
cv2.imwrite ( "myfig.png", изображение)
Но это на всякий случай, если вам нужно работать с Open CV. В противном случае plt.savefig () должно быть достаточно.
источник
Вы можете сохранить свое изображение с любым расширением (PNG, JPG и т. Д.) И с разрешением, которое вы хотите. Вот функция для сохранения вашей фигуры.
'fig_id' - это имя, под которым вы хотите сохранить свою фигуру. Надеюсь, поможет:)
источник
Вы можете сделать это так:
источник