Шпаргалка по Matplotlib
Последнее обновление
Figure и axes
Figure это всё изображение целиком. Axes это один график внутри него, и почти каждый вызов ниже это метод ax.
| Задача | Код |
|---|---|
| Импорт pyplot | import matplotlib.pyplot as plt |
| Одна figure с одним графиком | fig, ax = plt.subplots() |
| Размер в дюймах | fig, ax = plt.subplots(figsize=(8, 4)) |
| Рисовать на axes | ax.plot(x, y) |
| Показать figure | plt.show() |
| Сохранить чёткий PNG | fig.savefig("chart.png", dpi=150, bbox_inches="tight") |
| Сохранить в векторном формате | fig.savefig("chart.svg"), fig.savefig("chart.pdf") |
| Прозрачный фон | fig.savefig("chart.png", transparent=True) |
| Закрыть figure и освободить память | plt.close(fig) |
| Быстрый график в стиле pyplot | plt.plot(x, y)
plt.title("Quick look")
plt.show() |
Типы графиков
| Задача | Код |
|---|---|
| Линейный график | ax.plot(x, y) |
| Диаграмма рассеяния | ax.scatter(x, y, s=20, alpha=0.7) |
| Рассеяние с цветом по значению и шкалой | points = ax.scatter(x, y, c=y, cmap="viridis")
fig.colorbar(points, ax=ax) |
| Столбчатая диаграмма | ax.bar(cats, a) |
| Горизонтальные столбцы | ax.barh(cats, a) |
| Столбцы с накоплением | ax.bar(cats, a, label="2025")
ax.bar(cats, b, bottom=a, label="2026") |
| Сгруппированные столбцы | pos = np.arange(len(cats))
ax.bar(pos - 0.2, a, width=0.4)
ax.bar(pos + 0.2, b, width=0.4)
ax.set_xticks(pos, labels=cats) |
| Гистограмма | ax.hist(data, bins=30) |
| Ящик с усами | ax.boxplot([data, data * 2], tick_labels=["A", "B"]) |
| Скрипичная диаграмма | ax.violinplot([data, data * 2]) |
| Круговая диаграмма | ax.pie([40, 35, 25], labels=cats, autopct="%1.0f%%") |
| Полоса между двумя кривыми | ax.fill_between(x, y - 0.2, y + 0.2, alpha=0.3) |
| Планки погрешностей | ax.errorbar([1, 2, 3], [4, 5, 3], yerr=[0.5, 0.3, 0.6], fmt="o", capsize=4) |
| Ступенчатый график | ax.step(x, y, where="mid") |
| Тепловая карта 2D-массива | image = ax.imshow(np.random.default_rng(0).random((5, 5)), cmap="magma")
fig.colorbar(image, ax=ax) |
| Контурный график с заливкой | X, Y = np.meshgrid(x, x)
ax.contourf(X, Y, np.sin(X) * np.cos(Y), levels=20) |
| Плотность множества точек | ax.hexbin(data, data + np.random.default_rng(1).normal(size=200), gridsize=20) |
| Горизонтальная или вертикальная линия | ax.axhline(0, color="gray", linestyle="--"), ax.axvline(5) |
| Закрасить диапазон | ax.axvspan(2, 4, alpha=0.2) |
Линии, маркеры и цвета
| Задача | Код |
|---|---|
| Цвет, толщина и стиль линии | ax.plot(x, y, color="tab:red", linewidth=2, linestyle="--") |
| Маркеры на точках | ax.plot(x, y, marker="o", markersize=4) |
| Короткая строка формата | ax.plot(x, y, "g--o") |
| Прозрачность | ax.plot(x, y, alpha=0.5) |
| Стили линий | "-", "--", "-.", ":" |
| Коды маркеров | "o", "s", "^", "x", ".", "*" |
| Способы задать цвет | "tab:blue", "C1", "#1f77b4", (0.2, 0.4, 0.6) |
| n цветов из colormap | colors = plt.colormaps["viridis"](np.linspace(0, 1, 5)) |
| Свой цикл цветов | ax.set_prop_cycle(color=["#0b7285", "#e8590c", "#5f3dc4"]) |
| Столбцы с обводкой и штриховкой | ax.bar(cats, a, color="white", edgecolor="black", hatch="//") |
Заголовки, подписи и легенды
| Задача | Код |
|---|---|
| Заголовок и подписи осей | ax.set_title("Sales"), ax.set_xlabel("Month"), ax.set_ylabel("EUR") |
| Всё одним вызовом | ax.set(title="Sales", xlabel="Month", ylabel="EUR") |
| Легенда из подписей линий | ax.plot(x, y, label="sin")
ax.legend() |
| Положение и столбцы легенды | ax.legend(loc="upper right", ncols=2, frameon=False) |
| Легенда за пределами графика | ax.legend(loc="center left", bbox_to_anchor=(1, 0.5)) |
| Текст в точке данных | ax.text(5, 0.5, "note") |
| Аннотация со стрелкой | ax.annotate("peak", xy=(1.57, 1), xytext=(3, 1.2), arrowprops=dict(arrowstyle="->")) |
| Значения над столбцами | bars = ax.bar(cats, a)
ax.bar_label(bars) |
| Заголовок всей figure | fig.suptitle("Q1 report") |
| Формулы в подписях | ax.set_xlabel(r"$\alpha$ (rad)") |
Оси, деления и шкалы
| Задача | Код |
|---|---|
| Границы осей | ax.set_xlim(0, 10), ax.set_ylim(bottom=0) |
| Логарифмическая шкала | ax.set_yscale("log") |
| Свои деления и подписи к ним | ax.set_xticks([0, 5, 10], labels=["start", "middle", "end"]) |
| Повернуть подписи делений | ax.tick_params(axis="x", labelrotation=45) |
| Линии сетки | ax.grid(True, alpha=0.3) |
| Ось в процентах | from matplotlib.ticker import PercentFormatter
ax.yaxis.set_major_formatter(PercentFormatter(1.0)) |
| Разделитель тысяч | ax.yaxis.set_major_formatter("{x:,.0f}") |
| Убрать верхнюю и правую рамку | ax.spines[["top", "right"]].set_visible(False) |
| Вторая ось y справа | ax2 = ax.twinx()
ax2.plot(x, y * 100, color="tab:orange") |
| Одинаковый масштаб по осям | ax.set_aspect("equal") |
| Перевернуть ось | ax.invert_yaxis() |
| Полностью скрыть оси | ax.axis("off") |
| Читаемые подписи дат | fig.autofmt_xdate() |
Subplots и компоновка
plt.subplots(rows, cols) возвращает массив NumPy из axes. Обращайся к нему по индексам, как к обычному массиву.
| Задача | Код |
|---|---|
| Сетка графиков | fig, axs = plt.subplots(2, 2, figsize=(8, 6)) |
| Рисовать на одном из них | axs[0, 1].plot(x, y) |
| Цикл по всем графикам | for ax in axs.flat:
ax.grid(True) |
| Общая ось для графиков | fig, axs = plt.subplots(1, 3, sharey=True) |
| Отступы без наложений | fig, axs = plt.subplots(2, 2, layout="constrained") |
| Убрать наложения после отрисовки | fig.tight_layout() |
| Столбцы разной ширины | fig, axs = plt.subplots(1, 2, width_ratios=[3, 1]) |
| Именованная схема с широкой панелью | fig, axd = plt.subplot_mosaic([["top", "top"], ["left", "right"]])
axd["top"].plot(x, y) |
| Маленький график внутри графика | inset = ax.inset_axes([0.6, 0.6, 0.35, 0.35]) |
| Скрыть пустую панель | axs[0].axis("off") |
Стили и настройки по умолчанию
| Задача | Код |
|---|---|
| Встроенный стиль | plt.style.use("ggplot") |
| Список стилей | plt.style.available |
| Вид seaborn без seaborn | plt.style.use("seaborn-v0_8-whitegrid") |
| Стиль только для одной figure | with plt.style.context("dark_background"):
fig, ax = plt.subplots() |
| Размер шрифта по умолчанию | plt.rcParams["font.size"] = 12 |
| Размер и разрешение figure по умолчанию | plt.rcParams["figure.figsize"] = (8, 4), plt.rcParams["figure.dpi"] = 120 |
| Вернуть настройки по умолчанию | plt.style.use("default") |
| Популярные colormap: последовательные, расходящиеся, серые | "viridis", "coolwarm", "Greys" |
Графики из pandas
pandas рисует через Matplotlib. Передай ax=, чтобы рисовать в свои axes, или сохрани ax, который возвращает pandas.
| Задача | Код |
|---|---|
| Столбцы DataFrame в свои axes | df.plot(x="month", y="sales", ax=ax) |
| Столбчатая диаграмма по группам | df.groupby("city")["sales"].sum().plot.bar(ax=ax) |
| Доработать то, что нарисовал pandas | ax = df.plot(x="month", y="sales")
ax.set_title("Sales") |
| Столбцы напрямую в Matplotlib | ax.plot(df["month"], df["sales"]) |
Matplotlib 3.11: старые формы и что писать теперь
Код из старых туториалов в Matplotlib 3.11 может падать или выдавать предупреждения. Пиши вместо него то, что указано в столбце Matplotlib 3.11.
| Задача | Matplotlib 3.11 | Старая форма |
|---|---|---|
| Подписи ящика с усами | ax.boxplot([data, data * 2], tick_labels=["A", "B"]) | labels=["A", "B"] |
| Горизонтальный ящик или скрипка | ax.boxplot(data, orientation="horizontal") | vert=False |
| Получить colormap | plt.colormaps["viridis"] | plt.cm.get_cmap("viridis") |
| Стиль seaborn | plt.style.use("seaborn-v0_8") | plt.style.use("seaborn") |
Код Matplotlib, который превращает данные в понятный график, разбитый по задачам: figure и axes, типы графиков, линии и цвета, заголовки и легенды, оси и деления, subplots и компоновка, стили и графики из pandas. В каждой строке короткий фрагмент кода, который можно сразу вставить, и одна строчка о том, что он делает.
Всё здесь написано в объектно-ориентированном стиле (fig, ax = plt.subplots(), а дальше методы ax) для Matplotlib 3.11, той версии, что работает на Coddy. Старые формы вроде labels= в boxplot остались только в последней таблице, рядом с тем, что писать вместо них. В примерах используются x = np.linspace(0, 10, 50), y = np.sin(x) и выборка нормально распределённых значений data. Только начинаешь с Python? Загляни в шпаргалку по Python, а рядом с этой шпаргалкой держи шпаргалки по pandas, NumPy и scikit-learn.
Частые вопросы о шпаргалке по Matplotlib
Эта шпаргалка по Matplotlib бесплатная?
Чем plt отличается от ax?
plt.plot() рисует на текущих axes, какими бы они ни были, и это удобно для одного быстрого графика. fig, ax = plt.subplots() даёт тебе figure и axes как объекты, поэтому ax.plot() всегда рисует именно там, где нужно. Используй стиль с ax везде, где графиков больше одного, и в коде, который ты будешь сохранять.Как изменить размер figure?
figsize в дюймах при создании figure: fig, ax = plt.subplots(figsize=(10, 5)). Чтобы изменить размер по умолчанию для всех figure, задай plt.rcParams["figure.figsize"] = (10, 5). Размер сохранённого файла в пикселях равен figsize, умноженному на dpi.Как сохранить график в высоком разрешении?
fig.savefig("chart.png", dpi=300, bbox_inches="tight"). Чем выше dpi, тем чётче PNG, а bbox_inches="tight" обрезает пустые поля. Для печати или слайдов сохраняй в SVG или PDF: они остаются чёткими при любом размере.Почему заголовки и подписи subplots налезают друг на друга?
layout="constrained", например plt.subplots(2, 2, layout="constrained"), и Matplotlib сам освободит место для заголовков, подписей и цветовых шкал. Для уже созданной figure вызови fig.tight_layout() после отрисовки.Какую версию Matplotlib охватывает шпаргалка?
labels= в boxplot (теперь tick_labels=) и plt.cm.get_cmap (теперь plt.colormaps[...]), собраны в последней таблице рядом с тем, что писать вместо них.