17

Сохранить график в файл изображения вместо его отображения

15

У меня есть код на Python, который отображает график в графическом интерфейсе с использованием библиотеки Matplotlib:

import matplotlib.pyplot as plt
plt.plot([1, 2, 3], [1, 4, 9])
plt.show()

Однако я хочу сохранить этот график в файл, например, в формате PNG (foo.png), вместо того чтобы отображать его. Как это можно сделать?

5 ответ(ов)

1

Решение будет следующим:

import matplotlib.pyplot as plt

... # ваш способ создания графика
plt.savefig('foo.png')

Не забудьте заменить ... на свой код для создания графика. Использование plt.savefig позволяет сохранить график в файл с заданным именем, в данном случае 'foo.png'.

0

Если вам не нравится концепция "текущей" фигуры, вы можете использовать следующий код:

import matplotlib.image as mpimg

img = mpimg.imread("src.png")
mpimg.imsave("out.png", img)

Этот код считывает изображение из файла "src.png" и сохраняет его под именем "out.png" без необходимости создания или использования фигуры.

0

Чтобы создать многостраничный 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, так как он помогает избежать утечек памяти, автоматически закрывая файл в конце работы.

0

Другие ответы верны. Однако иногда я сталкиваюсь с ситуацией, когда мне нужно открыть объект figure позднее. Например, я могу захотеть изменить размеры подписей, добавить сетку или выполнить другую обработку. В идеальном мире я просто повторно выполнил бы код, создающий график, и адаптировал бы настройки. Увы, мир не идеален. Поэтому, помимо сохранения в PDF или PNG, я добавляю следующий код:

with open('some_file.pkl', "wb") as fp:
    pickle.dump(fig, fp, protocol=4)

Таким образом, я могу позже загрузить объект фигуры и настроить параметры по своему усмотрению.

Я также записываю стек с исходным кодом и словарём locals() для каждой функции/метода в стеке, чтобы потом точно узнать, что именно сгенерировало фигуру.

P.S.: Будьте осторожны, так как этот метод иногда приводит к созданию очень больших файлов.

0

Для того чтобы выбрать, выводить ли график на экран или сохранять его в файл, вы можете воспользоваться следующим фрагментом кода после использования функций 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, график будет отображён на экране. Не забудьте указать свой путь и имя файла, если хотите сохранить график.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь