Как сохранить рисунок Matplotlib в файл (с примерами)
Вы можете использовать следующий базовый синтаксис для сохранения рисунка Matplotlib в файл:
import matplotlib.pyplot as plt #save figure in various formats plt.savefig('my_plot.png') plt.savefig('my_plot .jpg') plt.savefig('my_plot .pdf')
В следующих примерах показано, как использовать этот синтаксис на практике.
Пример 1: сохранить рисунок Matplotlib в файл PNG
Следующий код показывает, как сохранить фигуру Matplotlib в файл PNG:
import matplotlib.pyplot as plt #define data x = [1, 2, 3, 4, 5, 6] y = [8, 13, 14, 11, 16, 22] #create scatterplot with axis labels plt.plot (x, y) plt.xlabel('X Variable') plt.ylabel('Y Variable') #save figure to PNG file plt.savefig('my_plot.png')
Если мы перейдем к месту, где мы сохранили файл, мы сможем просмотреть его:

Пример 2: сохранить рисунок Matplotlib с плотным макетом
По умолчанию Matplotlib добавляет щедрые отступы вокруг рисунка.
Чтобы удалить это дополнение, мы можем использовать аргумент bbox_inches=’tight’ :
#save figure to PNG file with no padding plt.savefig('my_plot.png', bbox_inches='tight')

Обратите внимание, что снаружи графика меньше отступов.
Пример 3: сохранить рисунок Matplotlib с нестандартным размером
Вы также можете использовать аргумент dpi , чтобы увеличить размер рисунка Matplotlib при его сохранении:
#save figure to PNG file with increased size plt.savefig('my_plot.png', dpi = 100 )

Полную онлайн-документацию по функции savefig() в Matplotlib можно найти здесь .
Дополнительные ресурсы
В следующих руководствах объясняется, как выполнять другие распространенные функции в Matplotlib:
Сохранить график как изображение с помощью Matplotlib
Matplotlib — одна из наиболее широко используемых библиотек визуализации данных в Python. Обычно графики и визуализации Matplotlib делятся с другими.
В этой статье мы рассмотрим, как сохранить график в виде файла изображения с помощью Matplotlib.
Создание сюжета
Сначала создадим простой сюжет:
import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.sin(x) plt.plot(x, y) plt.show()
Здесь мы построили синусоидальную функцию, начиная с 0 и заканчивая 10 с шагом 0.1 . Выполнение этого кода дает:

Теперь давайте посмотрим, как мы можем сохранить эту фигуру как изображение.
Сохранить график как изображение в Matplotlib
В предыдущем примере мы сгенерировали график с помощью функции plot() , передав данные, которые мы хотели бы визуализировать.
Этот график создается, но не отображается нам, если мы не вызываем функцию show() . Функция show() , как следует из названия, показывает сгенерированный участок пользователю в окне.
После создания мы также можем сохранить этот рисунок / график как файл — используя функцию savefig() :
import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.sin(x) plt.plot(x, y) plt.savefig('saved_figure.png')
Теперь, когда мы запускаем код, вместо всплывающего окна с графиком у нас есть файл ( saved_figure.png ) в каталоге нашего проекта.
Этот файл содержит точно такое же изображение, которое мы бы показывали в окне:

Стоит отметить, что функция savefig() не уникальна для экземпляра plt . Вы также можете использовать его на объекте Figure :
import matplotlib.pyplot as plt import numpy as np fig = plt.figure() x = np.arange(0, 10, 0.1) y = np.sin(x) plt.plot(x, y) fig.savefig('saved_figure.png')
У функции savefig() есть обязательный аргумент filename . Здесь мы указали имя файла и формат.
Кроме того, она принимает другие варианты, такие как dpi , transparent , bbox_inches , quality и т.д.
В следующих разделах мы рассмотрим некоторые популярные варианты.
Настройка разрешения изображения
Параметр DPI определяет количество точек (пикселей) на дюйм. По сути, это разрешение создаваемого изображения. Давайте протестируем несколько разных вариантов:
import matplotlib.pyplot as plt import numpy as np fig = plt.figure() x = np.arange(0, 10, 0.1) y = np.sin(x) plt.plot(x, y) fig.savefig('saved_figure-50pi.png', dpi = 50) fig.savefig('saved_figure-100dpi.png', dpi = 100) fig.savefig('saved_figure-1000dpi.png', dpi = 1000)
Это приводит к появлению трех новых файлов изображений на нашем локальном компьютере, каждый с разным DPI:

Значение по умолчанию — 100 .
Сохраните прозрачное изображение с помощью Matplotlib
Аргумент transparent может быть использован для создания участка с прозрачным фоном. Это полезно, если вы будете использовать графическое изображение в презентации, на бумаге или хотите представить его в настройках индивидуального дизайна:
import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.sin(x) plt.plot(x, y) plt.savefig('saved_figure.png', transparent=True)
Если мы поместим это изображение на темный фон, это приведет к:

Изменение цвета графика
Вы можете изменить цвет подложки, используя аргумент facecolor . Он принимает color и по умолчанию white .
Изменим его на red :
import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.sin(x) plt.plot(x, y) plt.savefig('saved_figure-colored.png', facecolor = 'red')

Настройка границы изображения
Аргумент bbox_inches принимает строку и определяет границу вокруг граффика. Если мы хотим установить его так tight , то есть максимально обрезать рамку, мы можем установить аргументу bbox_inches значение ‘tight’ :
import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 10, 0.1) y = np.sin(x) plt.plot(x, y) plt.savefig('saved_figure-tight.png', bbox_inches = 'tight', facecolor='red')
В результате получается плотно упакованная коробка. Это легче визуализировать, если для справки раскрасить края другим цветом:

Вывод
В этом уроке мы рассмотрели несколько способов сохранить график в виде файла изображения с помощью Matplotlib.
Как сохранить plt.plot для последующего использования в других функциях?
передо мной стоит задача:
Создать класс с 3 методами
1 метод genPoints записывает в файл x значения от 0 до 99, в файл y рандомные двузначные значения.
2 метод drawPlot строит график по x и y из файлов.
3 метод scrPlot сохраняет график ввиде картинки.
У меня проблема в связи между методом 2 и 3. Я конечно наговнокодил так, что в методе drawPlot я создаю график и отображаю его, а в scrPlot я делаю тоже самое, но не отображаю, а сохраняю.
Вопрос: как передать график в метод scrPlot, чтобы в методе было мало строк кода (чтобы было что-то на подобие такого plt.savefig(‘foo.png’) без повторного plt.plot и сбора из текстового файла координат)
import matplotlib.pyplot as plt import random as rand class GDS_Plot: def __init__(self): pass def genPoints(self): xFile = open("x", "w") for i in range(0,100,1): xFile.write(str(i)) xFile.write("\n") yFile = open("y", "w") for i in range(0,100,1): yFile.write(str(rand.randint(10, 99))) yFile.write("\n") def drawPlot(self): xFile = open("x", "r") xVal = xFile.read() xVal_list = xVal.split('\n') xVal_list.pop(); xFile.close() for i in range(0, 100, 1): xVal_list[i] = int(xVal_list[i]) # print(xVal_list) yFile = open("y", "r") yVal = yFile.read() yVal_list = yVal.split('\n') yVal_list.pop(); yFile.close() for i in range(0, 100, 1): yVal_list[i] = int(yVal_list[i]) plt.plot(xVal_list, yVal_list) plt.show() def scrPlot(self): xFile = open("x", "r") xVal = xFile.read() xVal_list = xVal.split('\n') xVal_list.pop(); xFile.close() for i in range(0, 100, 1): xVal_list[i] = int(xVal_list[i]) # print(xVal_list) yFile = open("y", "r") yVal = yFile.read() yVal_list = yVal.split('\n') yVal_list.pop(); yFile.close() for i in range(0, 100, 1): yVal_list[i] = int(yVal_list[i]) # print(yVal_list) plt.plot(xVal_list, yVal_list) plt.savefig('foo.png') Plot = GDS_Plot() Plot.genPoints() Plot.drawPlot() Plot.scrPlot()
Отслеживать
задан 21 окт 2021 в 20:25
DarthAluminium DarthAluminium
11 2 2 бронзовых знака
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
import matplotlib.pyplot as plt import random as rand class GDS_Plot: def __init__(self): pass def genPoints(self): xFile = open("x", "w") for i in range(0, 100, 1): xFile.write(str(i)) xFile.write("\n") yFile = open("y", "w") for i in range(0, 100, 1): yFile.write(str(rand.randint(10, 99))) yFile.write("\n") def drawPlot(self): xFile = open("x", "r") xVal = xFile.read() xVal_list = xVal.split('\n') xVal_list.pop(); xFile.close() for i in range(0, 100, 1): xVal_list[i] = int(xVal_list[i]) yFile = open("y", "r") yVal = yFile.read() yVal_list = yVal.split('\n') yVal_list.pop(); yFile.close() for i in range(0, 100, 1): yVal_list[i] = int(yVal_list[i]) self._plt = plt.plot(xVal_list, yVal_list) plt.show() return xVal_list, yVal_list # +++ def scrPlot(self, xVal_list, yVal_list): # +++ plt.plot(xVal_list, yVal_list) plt.savefig('foo.png') Plot = GDS_Plot() Plot.genPoints() xVal_list, yVal_list = Plot.drawPlot() # +++ Plot.scrPlot(xVal_list, yVal_list) # +++
Отслеживать
ответ дан 21 окт 2021 в 21:01
73.2k 109 109 золотых знаков 38 38 серебряных знаков 55 55 бронзовых знаков
Спасибо, я придумал иначе. Я в методе drawPlot возвращаю fig, которая равна plt.figure(figsize=(8, 6))
В основной части кода
fig = Plot.drawPlot()
Plot.scrPlot(fig)
Сохранение графиков matplotlib в pdf файл
Есть несколько графиков matplotlib. Необходимо сохранить их в единый pdf файл. Что делать?
Способ I. Сохранение одного графика на одной странице с помощью PdfPages
Этот способ можно реализовать с помощью двух вариантов.
Использование магии matplotlib:
from matplotlib.backends.backend_pdf import PdfPages import matplotlib.pyplot as plt import numpy as np # Создание файла. pdf = PdfPages("Figures.pdf") # Создание сюжетов и их сохранение. FUNCTIONS = [np.sin, np.cos, np.sqrt, lambda x: x**2] X = np.linspace(-5, 5, 100) for function in FUNCTIONS: plt.plot(X, function(X)) pdf.savefig() plt.close() # Сохранение файла pdf.close()
Использование непосредственного доступа к фигурам:
from matplotlib.backends.backend_pdf import PdfPages import matplotlib.pyplot as plt import numpy as np # Создание массива фигур. FUNCTIONS = [np.sin, np.cos, np.sqrt, lambda x: x**2] X = np.linspace(-5, 5, 100) figures = [] for function in FUNCTIONS: figure = plt.figure() axes = figure.subplots() axes.plot(X, function(X)) figures.append(figure) # Массив фигур. # figures = [] # Создание файла и сохранение каждой фигуры. pdf = PdfPages("Figures.pdf") for figure in figures: pdf.savefig(figure) # Сохранение файла pdf.close()

Способ II. Сохранение нескольких графиков в на одной странице с помощью PdfPages
from matplotlib.backends.backend_pdf import PdfPages import matplotlib.pyplot as plt import numpy as np # Константы FUNCTIONS = [np.sin, np.cos, np.sqrt, lambda x: x**2, np.tan] X = np.linspace(-5, 5, 100) # Количество строк и столбоц на одной строке ROWS = 2 COLUMNS = 2 # Создание файла. pdf = PdfPages("Figures.pdf") # Цикл по страницам index = 0 for page in range(len(FUNCTIONS)//(ROWS*COLUMNS)+1): # Создаем фигуру с несколькими осями. figure = plt.figure(figsize=(12, 12)) axes = figure.subplots(ROWS, COLUMNS) # Цикл по строкам и столбцам for row in range(ROWS): for column in range(COLUMNS): if index < len(FUNCTIONS): axes[row, column].plot(X, FUNCTIONS[index](X)) index += 1 # Сохраняем страницу pdf.savefig(figure) # Сохранение файла pdf.close()

Так сделать не получится, если у нас есть массив уже конкретных построенных фигур. По той простой причине, на фигуре уже отрисовано то, что нужно, и так, как нужно. Да и к тому же, каждая фигура имеет свое значение dpi и size, которые влияют на отрисовку. Конечно, все это можно учесть, усложнив алгоритм, но намного проще перейти к 3 способу.
Способ III. Использование reportlab
Наиболее универсальный способ.
import matplotlib.pyplot as plt import numpy as np from io import BytesIO from reportlab.pdfgen import canvas from reportlab.lib.units import cm from reportlab.lib.utils import ImageReader # Создание массива фигур. FUNCTIONS = [np.sin, np.cos, np.sqrt, lambda x: x**2] X = np.linspace(-5, 5, 100) figures = [] for function in FUNCTIONS: figure = plt.figure() axes = figure.subplots() axes.plot(X, function(X)) figures.append(figure) # Массив фигур. # figures = [] # Отступ indent = 1.5 # Создаем canvas и устанавливаем текущее значение высоты c = canvas.Canvas("Figures.pdf") c.setTitle("Figures") height = indent # Цикл по фигурам. for figure in figures: # dpi и размер (в дюймах) графика dpi = figure.get_dpi() figureSize = figure.get_size_inches() # Создаем рамку вокруг графика. # Это не обязательно, но так удобнее вырезать распечатанный график ножницами. figure.patches.extend( [plt.Rectangle((0, 1/(dpi*figureSize[1])), width=1-2/(dpi*figureSize[0]), height=1-2/(dpi*figureSize[1]), transform=figure.transFigure, figure=figure, clip_on=False, edgecolor="black", facecolor="none", linewidth=1)]) # Рендер фигуры. image = BytesIO() figure.savefig(image, format="png") image.seek(0) image = ImageReader(image) # Размер фигуры в см. figureSize = figure.get_size_inches()*2.54 # A4 210×297 мм # Если выходим за пределы листа, то добавляем новый лист if height + figureSize[1] + indent > 29.7: height = indent c.showPage() # Добавляем image в pdf c.drawImage(image, (10.5-figureSize[0]/2)*cm, height*cm, figureSize[0]*cm, figureSize[1]*cm) height += figureSize[1] # Сохраняем. c.save()

Спасибо за прочтение статьи. Удачи!
