W3docs

Matplotlib Pyplot

Как работает matplotlib.pyplot: интерфейс с состоянием, ключевые функции, фигуры и оси, сохранение графиков и когда использовать OO API.

matplotlib.pyplot — это набор функций, которые заставляют Matplotlib работать подобно системе построения графиков MATLAB. Каждая функция создаёт или изменяет какой-либо элемент фигуры — добавляет оси, рисует линию, устанавливает заголовок — а pyplot автоматически отслеживает «текущую» фигуру и оси, так что вам не нужно передавать объекты вручную. На этой странице объясняется, как работает эта модель с состоянием, рассматриваются наиболее важные функции pyplot и показывается, когда стоит перейти к явному объектно-ориентированному API.

Что такое matplotlib.pyplot?

Matplotlib имеет два основных интерфейса:

ИнтерфейсСпособ доступаЛучше всего подходит для
pyplot (с состоянием)import matplotlib.pyplot as pltБыстрые скрипты, интерактивные блокноты
Объектно-ориентированныйfig, ax = plt.subplots()Сложные многопанельные фигуры, библиотеки, повторно используемый код

Оба интерфейса находятся в одной библиотеке. pyplot — это удобный слой: каждый вызов plt.something() в конечном счёте манипулирует теми же объектами Figure и Axes, которые OO-интерфейс предоставляет напрямую. Понимание этих отношений позволяет уверенно сочетать оба стиля.

Стандартный псевдоним — plt:

import matplotlib.pyplot as plt

Как работает интерфейс с состоянием

pyplot хранит внутреннюю ссылку на текущую фигуру и текущие оси. Когда вы вызываете plt.plot(), Matplotlib:

  1. Проверяет, существует ли уже фигура; если нет — создаёт её.
  2. Проверяет, есть ли у этой фигуры оси; если нет — добавляет один объект Axes, заполняющий фигуру.
  3. Рисует данные на этих осях.
import matplotlib.pyplot as plt

# No figure exists yet — pyplot creates one automatically
plt.plot([1, 2, 3], [4, 6, 5])
plt.title("My first plot")
plt.show()

Фигура и оси были созданы неявно. Это удобно для разовых графиков, но может приводить к неожиданностям при построении нескольких графиков в одном скрипте. Используйте plt.figure() и plt.clf() (очистить фигуру) или plt.close() для явного управления состоянием.

Основные функции pyplot

plt.plot() — рисование линий и маркеров

plt.plot(x, y) — рабочая лошадка. Рисует линии, маркеры или и то, и другое.

import matplotlib.pyplot as plt

months = [1, 2, 3, 4, 5, 6]
revenue = [12000, 15000, 13500, 17000, 19500, 22000]

plt.plot(months, revenue, color="steelblue", linewidth=2, marker="o", markersize=6)
plt.xlabel("Month")
plt.ylabel("Revenue ($)")
plt.title("Monthly Revenue")
plt.grid(True, linestyle="--", alpha=0.5)
plt.show()

Ключевые параметры plt.plot():

ПараметрПримеры значенийЭффект
color"red", "#2196F3", (0.1, 0.6, 0.8)Цвет линии и маркеров
linewidth / lw1, 2.5Толщина линии
linestyle / ls"-", "--", ":", "-."Сплошная, пунктирная, точечная, штрихпунктирная
marker"o", "s", "^", "x"Круг, квадрат, треугольник, крест
markersize / ms4, 8Размер маркера в точках
label"Series A"Текст, используемый функцией plt.legend()

plt.xlabel(), plt.ylabel(), plt.title()

Подписывают оси и добавляют заголовок. Все три принимают аргумент fontsize:

import matplotlib.pyplot as plt

plt.plot([0, 1, 2], [0, 1, 4])
plt.xlabel("x", fontsize=12)
plt.ylabel("x²", fontsize=12)
plt.title("Quadratic Growth", fontsize=14, fontweight="bold")
plt.show()

plt.legend()

Когда вы передаёте label= в вызов построения графика, plt.legend() превращает эти метки в блок на диаграмме:

import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]

plt.plot(x, [v**1 for v in x], label="Linear")
plt.plot(x, [v**2 for v in x], label="Quadratic")
plt.plot(x, [v**3 for v in x], label="Cubic")
plt.xlabel("x")
plt.ylabel("y")
plt.title("Growth Rates")
plt.legend()
plt.show()

Управляйте расположением легенды с помощью параметра loc: "upper left", "lower right", "best" (по умолчанию) и т. д.

plt.grid()

plt.grid(True) добавляет линии сетки. Используйте axis="x" или axis="y", чтобы ограничить сетку одной осью, и передавайте linestyle / alpha для стилизации линий:

plt.grid(True, axis="y", linestyle="--", alpha=0.7)

plt.xlim() и plt.ylim()

Устанавливают видимый диапазон по каждой оси:

import matplotlib.pyplot as plt

plt.plot([1, 2, 3, 4, 5], [2, 4, 1, 5, 3])
plt.xlim(0, 6)     # show a bit of padding on each side
plt.ylim(0, 7)
plt.show()

plt.xticks() и plt.yticks()

Управляют тем, какие метки делений отображаются и какие подписи они несут:

import matplotlib.pyplot as plt

plt.plot([0, 1, 2, 3, 4], [10, 20, 15, 25, 30])
plt.xticks([0, 1, 2, 3, 4], ["Mon", "Tue", "Wed", "Thu", "Fri"])
plt.yticks([10, 20, 30], ["Low", "Mid", "High"])
plt.show()

plt.figure()

Явно создаёт новую фигуру. Это важно в скриптах, которые строят несколько отдельных графиков:

import matplotlib.pyplot as plt

plt.figure(figsize=(8, 4))          # width, height in inches
plt.plot([1, 2, 3], [3, 1, 4])
plt.title("Figure with custom size")
plt.show()

figsize управляет размером вывода. Широкая фигура (например, (12, 4)) подходит для данных временных рядов; квадратная — для диаграмм рассеяния.

plt.savefig()

Сохраняет текущую фигуру в файл вместо отображения (или в дополнение к нему):

import matplotlib.pyplot as plt

plt.plot([1, 2, 3], [1, 4, 9])
plt.title("Saved Plot")
plt.savefig("output.png", dpi=150, bbox_inches="tight")
plt.show()

Поддерживаемые форматы включают png, pdf, svg и jpg. bbox_inches="tight" обрезает лишние отступы вокруг фигуры. Вызывайте savefig() до show() — в некоторых бэкендах show() сбрасывает состояние фигуры.

plt.close() и plt.clf()

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

plt.close()       # close the current figure
plt.close("all")  # close every open figure
plt.clf()         # clear the current figure without closing its window

Подграфики через pyplot

plt.subplots() — это мост между интерфейсами pyplot и OO. Он создаёт объект Figure и один или несколько объектов Axes, а затем возвращает оба:

import matplotlib.pyplot as plt

fig, axes = plt.subplots(1, 2, figsize=(10, 4))  # 1 row, 2 columns

# Left panel
axes[0].plot([1, 2, 3], [1, 4, 9], color="steelblue")
axes[0].set_title("Quadratic")
axes[0].set_xlabel("x")
axes[0].set_ylabel("x²")

# Right panel
axes[1].plot([1, 2, 3], [1, 8, 27], color="tomato")
axes[1].set_title("Cubic")
axes[1].set_xlabel("x")
axes[1].set_ylabel("x³")

fig.suptitle("Growth Curves", fontsize=14)
plt.tight_layout()
plt.show()

plt.tight_layout() автоматически регулирует расстояние между панелями, чтобы заголовки и подписи не перекрывались.

pyplot и объектно-ориентированный API

Как только вы выходите за пределы одних осей, интерфейс с состоянием становится сложнее для понимания. Используйте OO API (через fig, ax = plt.subplots()), когда:

  • У вас более одного подграфика.
  • Вы пишете функцию, которая создаёт и возвращает график.
  • Вам нужен точный контроль над форматировщиками делений, вспомогательными осями или встроенными осями.
ЗадачаСтиль pyplotСтиль OO
Установить заголовокplt.title("...")ax.set_title("...")
Установить метку оси xplt.xlabel("...")ax.set_xlabel("...")
Установить пределы оси xplt.xlim(0, 10)ax.set_xlim(0, 10)
Нарисовать линиюplt.plot(x, y)ax.plot(x, y)

Паттерн прост: большинство функций plt.something() имеют эквивалент ax.set_something() на объекте Axes.

Полный пример

Следующий скрипт объединяет наиболее распространённые функции pyplot в один самодостаточный, готовый к запуску пример:

import matplotlib.pyplot as plt

# Data
years = [2019, 2020, 2021, 2022, 2023]
product_a = [45, 38, 52, 61, 70]
product_b = [30, 42, 39, 55, 65]

# Figure
plt.figure(figsize=(9, 5))

# Two series
plt.plot(years, product_a, marker="o", color="steelblue",
         linewidth=2, label="Product A")
plt.plot(years, product_b, marker="s", color="tomato",
         linewidth=2, label="Product B")

# Labels and decoration
plt.xlabel("Year", fontsize=12)
plt.ylabel("Units Sold (thousands)", fontsize=12)
plt.title("Annual Sales Comparison", fontsize=14)
plt.legend()
plt.grid(True, linestyle="--", alpha=0.5)
plt.xticks(years)

# Save and display
plt.savefig("sales_comparison.png", dpi=150, bbox_inches="tight")
plt.show()

Этот пример показывает обе серии на одних осях, легенду, сетку, пользовательские метки делений по оси x и сохраняет результат в файл PNG.

Распространённые ошибки

Забыть plt.show() — в обычном Python-скрипте (не в Jupyter) окно с графиком не откроется без этого вызова. В Jupyter %matplotlib inline делает это автоматически.

Вызов plt.savefig() после plt.show()show() завершает и сбрасывает фигуру. Сначала сохраняйте, потом показывайте:

plt.savefig("chart.png")  # correct order
plt.show()

Накопление множества фигур — в цикле каждый вызов plt.figure() создаёт новую фигуру, которая остаётся в памяти до вызова plt.close(). Закрывайте фигуры, когда они больше не нужны.

Непоследовательное смешение стилей pyplot и OO — использовать оба стиля допустимо, но делайте это осознанно: получите объект Axes и работайте с ним напрямую, а не полагайтесь на неявные «текущие оси» pyplot, когда у вас несколько осей.

Следующие шаги

  • Matplotlib Line Plots — стили линий, несколько серий и залитые области в подробностях.
  • Matplotlib Markers — все встроенные формы маркеров и способы их стилизации.
  • Matplotlib Labels — заголовки, подписи осей, аннотации и размещение текста.
  • Matplotlib Grid — стили линий сетки, малые деления и оформление фона.
  • Matplotlib Bars — вертикальные, горизонтальные, накопленные и сгруппированные гистограммы.
  • Matplotlib Scatter — диаграммы рассеяния с цветовыми картами и кодированием размером.
  • Matplotlib Histograms — управление корзинами, кривые плотности и перекрывающиеся распределения.
  • Matplotlib Subplot — многопанельные макеты с subplots() и GridSpec.
Was this page helpful?