Сохраните изображение в файл изображения вместо его отображения с помощью Matplotlib
Я пишу быстро и грязно script, чтобы генерировать графики на лету. Я использую код ниже (из 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), так что, например, он может использоваться в пакетных сценариях. Как это сделать?
Ответы
Ответ 1
Пока на вопрос дан ответ, я хотел бы добавить несколько полезных советов при использовании matplotlib.pyplot.savefig. Формат файла может быть указан расширением:
from matplotlib import pyplot as plt
plt.savefig('foo.png')
plt.savefig('foo.pdf')
Даст растеризованный или векторизованный вывод соответственно, оба могут быть полезны. Кроме того, вы обнаружите, что pylab
оставляет pylab
, часто нежелательные, пробелы вокруг изображения. Удалите это с:
savefig('foo.png', bbox_inches='tight')
Ответ 2
Как уже говорили другие, plt.savefig()
или fig1.savefig()
действительно способ сохранить изображение.
Однако я обнаружил, что в некоторых случаях эта цифра всегда отображается. (Например, когда Spyder имеет plt.ion()
: интерактивный режим = Вкл.) Я работаю над этим, заставляя закрывать окно рисунка в моем гигантском цикле с помощью plt.close(figure_object)
(см. документацию), поэтому я не надеваю не будет миллиона открытых фигур во время цикла:
import matplotlib.pyplot as plt
fig, ax = plt.subplots( nrows=1, ncols=1 ) # create figure & 1 axis
ax.plot([0,1,2], [10,20,3])
fig.savefig('path/to/save/image/to.png') # save the figure to file
plt.close(fig) # close the figure window
Вы сможете снова открыть фигуру позже, если это необходимо, с помощью fig.show()
(не проверял себя).
Ответ 3
Решение:
pylab.savefig('foo.png')
Ответ 4
Только что нашел эту ссылку в документации MatPlotLib, посвященной именно этой проблеме: http://matplotlib.org/faq/howto_faq.html#generate-images-without-having-a-window-appear
Они говорят, что самый простой способ предотвратить появление фигуры - это использовать неинтерактивный бэкэнд (например, Agg) через matplotib.use(<backend>)
, например:
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
plt.plot([1,2,3])
plt.savefig('myfig')
Я все еще лично предпочитаю использовать plt.close( fig )
, Так как тогда у вас есть возможность скрыть определенные фигуры (во время цикла), но по-прежнему отображать фигуры для обработки данных после цикла. Это, вероятно, медленнее, чем выбор неинтерактивного бэкэнда - было бы интересно, если бы кто-нибудь это проверил.
ОБНОВЛЕНИЕ: для Spyder, вы обычно не можете установить бэкэнд таким образом (потому что Spyder обычно загружает matplotlib рано, не давая вам использовать matplotlib.use()
).
Вместо этого используйте plt.switch_backend('Agg')
или отключите "enable support" в настройках Spyder и выполните команду matplotlib.use('Agg')
самостоятельно.
Из этих двух подсказок: один, два
Ответ 5
Если вам не нравится концепция "текущей" фигуры, выполните:
import matplotlib.image as mpimg
img = mpimg.imread("src.png")
mpimg.imsave("out.png", img)
Ответ 6
Другие ответы верны. Тем не менее, я иногда обнаруживаю, что я хочу открыть объект фигуры позже. Например, я могу изменить размеры меток, добавить сетку или выполнить другую обработку. В идеальном мире я просто перезапущу код, генерирующий сюжет, и адаптирую настройки. Увы, мир не совершенен. Поэтому, помимо сохранения в PDF или PNG, я добавляю:
with open('some_file.pkl', "wb") as fp:
pickle.dump(fig, fp, protocol=4)
Таким образом, я могу позже загрузить объект фигуры и манипулировать настройками, как мне нравится.
Я также выписываю стек с исходным кодом и словарем locals()
для каждой функции/метода в стеке, поэтому я могу позже сказать точно, что сгенерировало фигуру.
NB: будьте осторожны, поскольку иногда этот метод генерирует огромные файлы.
Ответ 7
После использования plot() и других функций для создания содержимого, которое вы хотите, вы можете использовать такое предложение, чтобы выбирать между выводом на экран или в файл:
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(4, 5)) # size in inches
# use plot(), etc. to create your plot.
# Pick one of the following lines to uncomment
# save_file = None
# save_file = os.path.join(your_directory, your_file_name)
if save_file:
plt.savefig(save_file)
plt.close(fig)
else:
plt.show()
Ответ 8
import datetime
import numpy as np
from matplotlib.backends.backend_pdf import PdfPages
import matplotlib.pyplot as plt
# Create the PdfPages object to which we will save the pages:
# The with statement makes sure that the PdfPages object is closed properly at
# the end of the block, even if an Exception occurs.
with PdfPages('multipage_pdf.pdf') as pdf:
plt.figure(figsize=(3, 3))
plt.plot(range(7), [3, 1, 4, 1, 5, 9, 2], 'r-o')
plt.title('Page One')
pdf.savefig() # saves the current figure into a pdf page
plt.close()
plt.rc('text', usetex=True)
plt.figure(figsize=(8, 6))
x = np.arange(0, 5, 0.1)
plt.plot(x, np.sin(x), 'b-')
plt.title('Page Two')
pdf.savefig()
plt.close()
plt.rc('text', usetex=False)
fig = plt.figure(figsize=(4, 5))
plt.plot(x, x*x, 'ko')
plt.title('Page Three')
pdf.savefig(fig) # or you can pass a Figure object to pdf.savefig
plt.close()
# We can also set the file metadata via the PdfPages object:
d = pdf.infodict()
d['Title'] = 'Multipage PDF Example'
d['Author'] = u'Jouni K. Sepp\xe4nen'
d['Subject'] = 'How to create a multipage pdf file and set its metadata'
d['Keywords'] = 'PdfPages multipage keywords author title subject'
d['CreationDate'] = datetime.datetime(2009, 11, 13)
d['ModDate'] = datetime.datetime.today()
Ответ 9
Я использовал следующее:
import matplotlib.pyplot as plt
p1 = plt.plot(dates, temp, 'r-', label="Temperature (celsius)")
p2 = plt.plot(dates, psal, 'b-', label="Salinity (psu)")
plt.legend(loc='upper center', numpoints=1, bbox_to_anchor=(0.5, -0.05), ncol=2, fancybox=True, shadow=True)
plt.savefig('data.png')
plt.show()
f.close()
plt.close()
Я нашел очень важным использовать plt.show после сохранения фигуры, иначе это не сработает. фигура экспортируется в png
Ответ 10
Вы можете:
plt.show(hold=False)
plt.savefig('name.pdf')
и не забудьте сохранить savefig перед закрытием графического интерфейса. Таким образом, вы можете увидеть изображение заранее.
В качестве альтернативы вы можете посмотреть его с помощью plt.show()
Затем закройте графический интерфейс и снова запустите script, но на этот раз замените plt.show()
на plt.savefig()
.
В качестве альтернативы вы можете использовать
fig, ax = plt.figure(nrows=1, ncols=1)
plt.plot(...)
plt.show()
fig.savefig('out.pdf')
Ответ 11
Если, как и я, вы используете IDE Spyder, вам необходимо отключить интерактивный режим с помощью
plt.ioff()
(эта команда запускается автоматически при научном запуске)
Если вы хотите снова включить его, используйте:
plt.ion()
Ответ 12
Решение:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
matplotlib.style.use('ggplot')
ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))
ts = ts.cumsum()
plt.figure()
ts.plot()
plt.savefig("foo.png", bbox_inches='tight')
Если вы хотите отобразить изображение, а также сохранить использование изображения:
%matplotlib inline
после
import matplotlib
Ответ 13
В соответствии с вопросом Matplotlib (pyplot) savefig выводит пустое изображение.
Следует отметить одну вещь: если вы используете plt.show
и это следует после plt.savefig
, или вы дадите пустое изображение.
Подробный пример:
import numpy as np
import matplotlib.pyplot as plt
def draw_result(lst_iter, lst_loss, lst_acc, title):
plt.plot(lst_iter, lst_loss, '-b', label='loss')
plt.plot(lst_iter, lst_acc, '-r', label='accuracy')
plt.xlabel("n iteration")
plt.legend(loc='upper left')
plt.title(title)
plt.savefig(title+".png") # should before plt.show method
plt.show()
def test_draw():
lst_iter = range(100)
lst_loss = [0.01 * i + 0.01 * i ** 2 for i in xrange(100)]
# lst_loss = np.random.randn(1, 100).reshape((100, ))
lst_acc = [0.01 * i - 0.01 * i ** 2 for i in xrange(100)]
# lst_acc = np.random.randn(1, 100).reshape((100, ))
draw_result(lst_iter, lst_loss, lst_acc, "sgd_method")
if __name__ == '__main__':
test_draw()
![enter image description here]()
Ответ 14
#write the code for the plot
plt.savefig("filename.png")
Файл будет сохранен в том же каталоге, что и запущенный файл python/Jupyter.
Ответ 15
import matplotlib.pyplot as plt
plt.savefig("image.png")
В Jupyter Notebook вы должны удалить plt.show()
и добавить plt.savefig()
вместе с остальным plt-кодом в одной ячейке. Изображение все равно будет отображаться в вашей записной книжке.
Ответ 16
Учитывая, что сегодня (не было доступно, когда был задан этот вопрос) многие люди используют Jupyter Notebook в качестве консоли Python, существует чрезвычайно простой способ сохранить графики как .png
, просто вызвать класс matplotlib
pylab
из Jupyter Notebook и построить график. "встроенные" ячейки юпитера, а затем перетащите эту фигуру/изображение в локальный каталог. Не забудьте %matplotlib inline
в первую строку %matplotlib inline
!
Ответ 17
В дополнение к вышеперечисленному, я добавил __file__
для имени, чтобы изображение и файл Python получили одинаковые имена. Я также добавил несколько аргументов, чтобы он выглядел лучше:
# Saves a PNG file of the current graph to the folder and updates it every time
# (nameOfimage, dpi=(sizeOfimage),Keeps_Labels_From_Disappearing)
plt.savefig(__file__+".png",dpi=(250), bbox_inches='tight')
# Hard coded name: './test.png'
Окончательный совет найден ЗДЕСЬ.
Ответ 18
Вы можете сохранить свое изображение с любым расширением (PNG, JPG и т.д.) И с разрешением, которое вы хотите. Здесь есть функция для сохранения вашей фигуры.
import os
def save_fig(fig_id, tight_layout=True, fig_extension="png", resolution=300):
path = os.path.join(IMAGES_PATH, fig_id + "." + fig_extension)
print("Saving figure", fig_id)
if tight_layout:
plt.tight_layout()
plt.savefig(path, format=fig_extension, dpi=resolution)
'fig_id' - это имя, под которым вы хотите сохранить свою фигуру. Надеюсь, поможет:)
Ответ 19
Вы можете сделать это так:
def plotAFig():
plt.figure()
plt.plot(x,y,'b-')
plt.savefig("figurename.png")
plt.close()