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:
- Проверяет, существует ли уже фигура; если нет — создаёт её.
- Проверяет, есть ли у этой фигуры оси; если нет — добавляет один объект
Axes, заполняющий фигуру. - Рисует данные на этих осях.
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 / lw | 1, 2.5 | Толщина линии |
linestyle / ls | "-", "--", ":", "-." | Сплошная, пунктирная, точечная, штрихпунктирная |
marker | "o", "s", "^", "x" | Круг, квадрат, треугольник, крест |
markersize / ms | 4, 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("...") |
| Установить метку оси x | plt.xlabel("...") | ax.set_xlabel("...") |
| Установить пределы оси x | plt.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.