Сохраните изображение в файл изображения вместо его отображения с помощью 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()