Сохранить график в файл изображения вместо его отображения
У меня есть код на Python, который отображает график в графическом интерфейсе с использованием библиотеки Matplotlib:
import matplotlib.pyplot as plt
plt.plot([1, 2, 3], [1, 4, 9])
plt.show()
Однако я хочу сохранить этот график в файл, например, в формате PNG (foo.png), вместо того чтобы отображать его. Как это можно сделать?
5 ответ(ов)
Решение будет следующим:
import matplotlib.pyplot as plt
... # ваш способ создания графика
plt.savefig('foo.png')
Не забудьте заменить ...
на свой код для создания графика. Использование plt.savefig
позволяет сохранить график в файл с заданным именем, в данном случае 'foo.png'.
Если вам не нравится концепция "текущей" фигуры, вы можете использовать следующий код:
import matplotlib.image as mpimg
img = mpimg.imread("src.png")
mpimg.imsave("out.png", img)
Этот код считывает изображение из файла "src.png" и сохраняет его под именем "out.png" без необходимости создания или использования фигуры.
Чтобы создать многостраничный PDF-файл с графиками в Python, вы можете воспользоваться библиотекой Matplotlib вместе с классом PdfPages
. Вот пример реализации:
import datetime
import numpy as np
from matplotlib.backends.backend_pdf import PdfPages
import matplotlib.pyplot as plt
# Создаем объект PdfPages, в который будем сохранять страницы:
# Использование контекстного менеджера гарантирует корректное закрытие объекта PdfPages в конце блока,
# даже если произойдет исключение.
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('Страница Первая')
pdf.savefig() # сохраняем текущую фигуру в виде страницы PDF
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('Страница Вторая')
pdf.savefig()
plt.close()
plt.rc('text', usetex=False)
fig = plt.figure(figsize=(4, 5))
plt.plot(x, x*x, 'ko')
plt.title('Страница Третья')
pdf.savefig(fig) # можно также передать объект Figure в pdf.savefig
plt.close()
# Также можно установить метаданные файла через объект PdfPages:
d = pdf.infodict()
d['Title'] = 'Пример Многостраничного PDF'
d['Author'] = u'Jouni K. Sepp\xe4nen'
d['Subject'] = 'Как создать многостраничный PDF файл и установить его метаданные'
d['Keywords'] = 'PdfPages многостраничный ключевые слова автор заголовок тема'
d['CreationDate'] = datetime.datetime(2009, 11, 13)
d['ModDate'] = datetime.datetime.today()
В данном коде создается PDF-файл с тремя страницами, каждая из которых содержит график. Мы также указываем метаданные для финального PDF-документа. Обратите внимание на использование контекстного менеджера with
, так как он помогает избежать утечек памяти, автоматически закрывая файл в конце работы.
Другие ответы верны. Однако иногда я сталкиваюсь с ситуацией, когда мне нужно открыть объект figure позднее. Например, я могу захотеть изменить размеры подписей, добавить сетку или выполнить другую обработку. В идеальном мире я просто повторно выполнил бы код, создающий график, и адаптировал бы настройки. Увы, мир не идеален. Поэтому, помимо сохранения в PDF или PNG, я добавляю следующий код:
with open('some_file.pkl', "wb") as fp:
pickle.dump(fig, fp, protocol=4)
Таким образом, я могу позже загрузить объект фигуры и настроить параметры по своему усмотрению.
Я также записываю стек с исходным кодом и словарём locals()
для каждой функции/метода в стеке, чтобы потом точно узнать, что именно сгенерировало фигуру.
P.S.: Будьте осторожны, так как этот метод иногда приводит к созданию очень больших файлов.
Для того чтобы выбрать, выводить ли график на экран или сохранять его в файл, вы можете воспользоваться следующим фрагментом кода после использования функций plot()
и других для создания необходимого графика:
import matplotlib.pyplot as plt
import os
fig = plt.figure(figsize=(4, 5)) # размер в дюймах
# используйте plot(), и т.д., чтобы создать ваш график.
# Выберите одну из следующих строк и уберите комментарий
# 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()
В этом коде, если save_file
задан, график будет сохранён в указанный файл. Если же save_file
равен None
, график будет отображён на экране. Не забудьте указать свой путь и имя файла, если хотите сохранить график.
Как вынести легенду за пределы графика
Как сделать графики Matplotlib отображаемыми внутри IPython-ноутбука?
Как изменить размер шрифта на графике matplotlib
Как задать размер шрифта заголовка фигуры и меток осей?
Изменение частоты делений по оси X или Y