Перейти к основному содержимому

Matplotlib — графики


Основы графиков на Python

Matplotlib — главная библиотека Python для построения графиков: линии, столбцы, точки, гистограммы, круговые диаграммы. Её используют в школе (график функции, лабораторная по физике), в вузе (курсовые, статистика) и на работе (отчёты, анализ данных).

С чего начать

Теория — Matplotlib — графики (архитектура, pyplot, экспорт). Массивы для осей X и Y — примеры NumPy. Символьные формулы (корни, производные) перед графиком — SymPy — уравнения и производные. Таблицы перед графиком — примеры Pandas, NumPy и pandas. Рисование фигур «от руки» — примеры Turtle (Python) или p5.js (браузер). Здесь — графики по числам: оси X и Y, подписи, легенда.

Как запустить пример

  1. Установите библиотеки (один раз в терминале или командной строке):
pip install matplotlib numpy
  1. Скопируйте код в файл, например grafik.py.
  2. Запустите: python grafik.py — откроется окно с графиком.
  3. В Google Colab или Jupyter Notebook вместо plt.show() график часто появляется прямо под ячейкой; show() тоже можно оставить.
Кому подойдёт эта страница

Школьникам — график y = x², синуса, температуры по дням. Студентам — scatter, гистограмма, box plot для лабораторных. Начинающим программистам — готовые шаблоны с разбором каждой строки: можно вставить в проект и поменять свои данные.


Базовые термины

ТерминПростыми словами
Figure«Лист» или окно, на котором рисуем
AxesОбласть с осями X и Y — сам график
plt.plot()Линия по точкам
plt.bar()Столбцы (столбчатая диаграмма)
plt.scatter()Точки (диаграмма рассеяния)
plt.hist()Гистограмма — сколько значений попало в каждый интервал
plt.show()Показать график на экране
label + legend()Подпись серии и легенда (что означает каждая линия)

Какой график выбрать

ЗадачаЧто рисоватьФункция
График функции (sin, x², физика)Линияplot
Сравнить категории (языки, оценки)Столбцыbar / barh
Связь двух величин (рост и вес)Точкиscatter
Распределение (сколько пятёрок, четвёрок)Гистограммаhist
Доли целого (100% = круг)Круговаяpie
Несколько графиков на одном листеПодграфикиsubplots

Обязательные элементы

Любой скрипт с Matplotlib строится по одной схеме: данные → рисование → подписи → показ.

import matplotlib.pyplot as plt
import numpy as np

# 1. Данные
x = np.linspace(0, 10, 100)
y = np.sin(x)

# 2. Рисование
plt.plot(x, y)

# 3. Подписи (без них график «голый» — преподаватель снимет баллы)
plt.xlabel("X")
plt.ylabel("Y")
plt.title("Заголовок")
plt.grid(True)

# 4. Показ
plt.show()

Разбор:

  • import matplotlib.pyplot as plt — подключаем pyplot и пишем коротко plt вместо длинного имени; это стандарт в учебниках и на Stack Overflow.
  • import numpy as np — NumPy считает sin, cos, массивы точек; Matplotlib только рисует.
  • np.linspace(0, 10, 100) — 100 равных шагов от 0 до 10 по оси X; линия получается гладкой, без «ломаных».
  • np.sin(x) — для каждой точки X считается Y; пишем формулу один раз — NumPy применяет её ко всему массиву.
  • plt.plot(x, y) — соединяет пары (x, y) линией.
  • xlabel, ylabel, title — подписи осей и заголовок; в отчёте обязательны.
  • grid(True) — сетка; проще читать значения с осей.
  • plt.show() — в обычном .py-файле без этой строки окно может мелькнуть и сразу закрыться.
Типичные ошибки новичков
  • Забыли plt.show() — «ничего не видно».
  • Перепутали порядок: сначала plot, потом подписи — порядок подписей не критичен, но show() всегда в конце.
  • Списки разной длины: x из 10 элементов, y из 8 — будет ошибка; длины должны совпадать.
  • Кириллица в подписях «квадратиками» — на Windows иногда нужен шрифт; для начала подойдут латинские подписи или plt.rcParams['font.family'] = 'DejaVu Sans'.

Стартовые графики

Пять типов, которые чаще всего ищут в интернете: линия, столбцы, точки, гистограмма, круговая.


Линейный график (sin, cos, любая функция)

Нужен, когда по оси X идёт время, угол или аргумент функции, а по Y — значение. Классика: синусоида, график из учебника алгебры.

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 2 * np.pi, 200)
y = np.sin(x)

plt.plot(x, y, color="steelblue", linewidth=2, label="sin(x)")
plt.axhline(0, color="gray", linewidth=0.8)
plt.xlabel("x")
plt.ylabel("sin(x)")
plt.title("Синусоида")
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()

Разбор:

  • 2 * np.pi — один полный период синуса (от 0 до 360° в радианах); 200 точек — линия гладкая.
  • color="steelblue" — цвет линии; можно "red", "#ff0000", "green".
  • linewidth=2 — толщина линии в пунктах.
  • label="sin(x)" — имя серии для легенды; без legend() подпись на графике не появится.
  • plt.axhline(0, ...) — горизонтальная линия y = 0 (ось абсцисс); удобно для синуса и косинуса.
  • alpha=0.3 у сетки — полупрозрачность 30%; сетка не перебивает сам график.

График параболы y = x² (частый школьный запрос)

Тот же plot, но данные можно задать списком Python — NumPy необязателен для простых задач.

import matplotlib.pyplot as plt

x = list(range(-5, 6)) # -5, -4, …, 5
y = [i ** 2 for i in x] # y = x²

plt.plot(x, y, marker="o", color="darkorange")
plt.xlabel("x")
plt.ylabel("y = x²")
plt.title("Парабола")
plt.grid(True)
plt.show()

Разбор:

  • range(-5, 6) — целые x от −5 до 5 включительно; для параболы симметрично вокруг нуля.
  • [i ** 2 for i in x] — list comprehension: для каждого x считаем x²; это и есть «формула» на Python.
  • marker="o" — кружки в каждой точке; видно, что график построен по дискретным значениям (можно убрать для гладкой линии).

Для y = 2x + 3 или y = -x² + 4x меняйте только формулу в списке y.


Столбчатая диаграмма (bar chart)

Сравнение категорий: языки программирования, оценки по предметам, продажи по месяцам. Высота столбца = величина.

import matplotlib.pyplot as plt

categories = ["Python", "Java", "Go", "Rust"]
values = [29, 17, 12, 8]

plt.bar(categories, values, color=["#3776ab", "#b07219", "#00add8", "#dea584"])
plt.ylabel("Доля опроса, %")
plt.title("Популярность языков (условные данные)")
plt.show()

Разбор:

  • categories — подписи под столбцами (строки).
  • values — высота каждого столбца; порядок совпадает с categories: Python → 29, Java → 17 и т.д.
  • color=[...] — свой цвет каждому столбцу; один цвет: color="blue".
  • plt.ylabel — что измеряем по вертикали; для bar chart это главная ось смысла.

Школьный вариант: categories = ["Математика", "Физика", "Информатика"], values = [5, 4, 5] — оценки или баллы.


Диаграмма рассеяния (scatter plot)

Показывает, есть ли связь между двумя числами: чем больше X, тем больше Y? Точки «облаком» — типичная картина для лабораторных и статистики.

import matplotlib.pyplot as plt
import numpy as np

rng = np.random.default_rng(42)
x = rng.normal(0, 1, 120)
y = 0.6 * x + rng.normal(0, 0.5, 120)

plt.scatter(x, y, alpha=0.6, edgecolors="white", linewidths=0.5)
plt.xlabel("Признак A")
plt.ylabel("Признак B")
plt.title("Scatter — связь двух переменных")
plt.grid(True, alpha=0.3)
plt.show()

Разбор:

  • default_rng(42) — генератор случайных чисел с фиксированным seed; при 42 график каждый раз одинаковый (удобно для сдачи работы).
  • rng.normal(0, 1, 120) — 120 случайных X вокруг 0 с разбросом 1 (нормальное распределение).
  • y = 0.6 * x + ... — линейная зависимость плюс шум; облако тянется вверх вправо — положительная корреляция.
  • scatter рисует отдельные точки, линию между ними не проводит.
  • alpha=0.6 — полупрозрачные точки; при наложении видно плотность.

Гистограмма (histogram)

Сколько значений попало в каждый интервал (корзину). Пример: рост класса, баллы за тест, время отклика сервера.

import matplotlib.pyplot as plt
import numpy as np

data = np.random.default_rng(0).normal(loc=100, scale=15, size=500)

plt.hist(data, bins=25, color="teal", edgecolor="white")
plt.xlabel("Значение")
plt.ylabel("Частота")
plt.title("Распределение выборки")
plt.show()

Разбор:

  • normal(loc=100, scale=15, size=500) — 500 случайных чисел вокруг среднего 100, разброс ±15 (условные «баллы»).
  • bins=25 — разбить диапазон на 25 столбиков; больше bins — мельче детали, меньше — грубее картина.
  • hist возвращает высоты столбиков; ось Y — сколько значений попало в интервал, не сами значения.
  • edgecolor="white" — белая граница между столбиками, график читается лучше.

Свои данные: data = [4, 5, 3, 5, 5, 4, 3, 5, 5, 5] — оценки класса; bins=5 или bins=[2.5, 3.5, 4.5, 5.5].


Круговая диаграмма (pie chart)

Доли от целого в процентах: бюджет, состав команды, ответы опроса. Сумма секторов должна быть 100% (или библиотека нормализует сама).

import matplotlib.pyplot as plt

labels = ["Backend", "Frontend", "DevOps", "Data"]
sizes = [40, 30, 15, 15]
explode = (0.05, 0, 0, 0)

plt.pie(
sizes,
explode=explode,
labels=labels,
autopct="%1.0f%%",
startangle=90,
colors=["#4c72b0", "#55a868", "#c44e52", "#8172b3"],
)
plt.title("Распределение задач в команде")
plt.axis("equal")
plt.show()

Разбор:

  • sizes — величина каждого сектора; 40 + 30 + 15 + 15 = 100 — проценты.
  • explode=(0.05, 0, 0, 0) — первый сектор «отодвинут» от центра для акцента.
  • autopct="%1.0f%%" — подпись процента на секторе (%.0f — без дробной части).
  • startangle=90 — первый сектор начинается сверху (как на 12 часов).
  • axis("equal") — круг остаётся кругом, а не овалом.

Круговую диагramму с более чем 5–6 секторами читают хуже столбчатой; для отчёта часто лучше bar.


Примеры графиков

Ниже — готовые заготовки с разбором: можно копировать целиком и менять числа под свою задачу.


1. Базовые типы

1.1. Несколько функций на одном графике

Сравнение sin, cos или нескольких экспериментов на одних осях. Обязательны label и legend().

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 300)

plt.plot(x, np.sin(x), label="sin(x)")
plt.plot(x, np.cos(x), label="cos(x)", linestyle="--")
plt.plot(x, np.sin(x) * np.exp(-0.1 * x), label="затухающая sin")
plt.legend()
plt.grid(True, alpha=0.3)
plt.title("Сравнение функций")
plt.xlabel("x")
plt.ylabel("y")
plt.show()

Разбор:

  • Три вызова plot на одних осях — три линии в одном окне.
  • linestyle="--" — пунктир для cos; можно "-" сплошная, ":" точки, "-." штрих-пунктир.
  • np.exp(-0.1 * x) — затухание амплитуды sin; пример из физики (колебания с трением).
  • legend() — блок «что какая линия»; без него подписи label не отображаются.

1.2. Горизонтальные столбцы (barh)

Те же столбцы, но лежат — удобно для длинных названий (навыки, фамилии, страны).

import matplotlib.pyplot as plt

skills = ["Git", "SQL", "Python", "Linux", "Docker"]
scores = [85, 78, 92, 70, 65]

plt.barh(skills, scores, color="cornflowerblue")
plt.xlabel("Балл")
plt.title("Навыки — горизонтальная диаграмма")
plt.xlim(0, 100)
plt.show()

Разбор:

  • barh — horizontal bar: первый аргумент — подписи по Y, второй — длина столбца по X.
  • xlim(0, 100) — ось от 0 до 100; шкала фиксирована, столбцы не «уплывают».

1.3. Групповые столбцы (две серии рядом)

Сравнение двух наборов по одним категориям: команда A и B по кварталам, мальчики и девочки по предметам.

import matplotlib.pyplot as plt
import numpy as np

groups = ["Q1", "Q2", "Q3", "Q4"]
team_a = [12, 19, 14, 22]
team_b = [10, 16, 18, 20]

x = np.arange(len(groups))
width = 0.35

fig, ax = plt.subplots()
ax.bar(x - width / 2, team_a, width, label="Команда A")
ax.bar(x + width / 2, team_b, width, label="Команда B")
ax.set_xticks(x)
ax.set_xticklabels(groups)
ax.set_ylabel("Закрытые задачи")
ax.set_title("Квартальная динамика")
ax.legend()
plt.show()

Разбор:

  • np.arange(len(groups)) — позиции 0, 1, 2, 3 на оси X (без подписей пока).
  • width = 0.35 — ширина одного столбца; два столбца рядом помещаются в одну «клетку».
  • x - width/2 и x + width/2 — сдвиг влево и вправо, столбцы не накладываются.
  • fig, ax = plt.subplots() — объектный стиль: все команды через ax, а не plt; так проще несколько графиков на одном листе.
  • set_xticks + set_xticklabels — подписи Q1…Q4 в нужных позициях.

1.4. Заливка между двумя кривыми (fill_between)

Показывает полосу между двумя функциями: допуск, коридор погрешности, min–max.

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 200)
y1 = np.sin(x)
y2 = np.cos(x)

plt.plot(x, y1, label="sin")
plt.plot(x, y2, label="cos")
plt.fill_between(x, y1, y2, alpha=0.25, color="steelblue")
plt.legend()
plt.title("Заливка между двумя сериями")
plt.grid(True, alpha=0.3)
plt.show()

Разбор:

  • fill_between(x, y1, y2) — закрашивает область между верхней и нижней линией.
  • alpha=0.25 — заливка полупрозрачная, линии sin/cos видны поверх.

2. Подграфики и компоновка

2.1. Сетка 2×2 (четыре графика на одном листе)

Один рисунок для отчёта: разные виды данных рядом.

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 100)

fig, axes = plt.subplots(2, 2, figsize=(9, 7))
fig.suptitle("Панель из четырёх графиков")

axes[0, 0].plot(x, np.sin(x))
axes[0, 0].set_title("sin(x)")

axes[0, 1].plot(x, np.cos(x), color="orange")
axes[0, 1].set_title("cos(x)")

axes[1, 0].scatter(x[::5], np.random.default_rng(1).normal(size=20))
axes[1, 0].set_title("Scatter")

axes[1, 1].hist(np.random.default_rng(2).normal(size=300), bins=20)
axes[1, 1].set_title("Гистограмма")

fig.tight_layout()
plt.show()

Разбор:

  • subplots(2, 2) — сетка 2 строки × 2 столбца; axes[строка, столбец] — доступ к каждой ячейке.
  • figsize=(9, 7) — размер всего окна в дюймах (ширина, высота).
  • suptitle — общий заголовок над всеми подграфиками; set_title — заголовок одной ячейки.
  • x[::5] — каждая 5-я точка из x (меньше точек на scatter для наглядности).
  • tight_layout() — автоматически поджимает отступы, подписи не наезжают друг на друга.

2.2. Два графика друг под другом с общей осью X

Классика для временных рядов: сверху продажи, снизу возвраты; месяцы на одной шкале.

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(1, 13)
sales = [40, 45, 50, 48, 55, 60, 58, 62, 65, 70, 68, 75]
returns = [2, 3, 2, 4, 3, 5, 4, 3, 6, 5, 4, 7]

fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True, figsize=(8, 6))
ax1.plot(x, sales, marker="o")
ax1.set_ylabel("Продажи")
ax1.set_title("Продажи и возвраты по месяцам")
ax1.grid(True, alpha=0.3)

ax2.bar(x, returns, color="salmon")
ax2.set_xlabel("Месяц")
ax2.set_ylabel("Возвраты")

fig.tight_layout()
plt.show()

Разбор:

  • subplots(2, 1) — два графика вертикально (2 строки, 1 столбец).
  • sharex=True — ось X одна на оба; подписи месяцев только снизу, сверху не дублируются.
  • (ax1, ax2) — распаковка двух осей в переменные; так код читается проще, чем axes[0] и axes[1].
  • marker="o" — точки на линии продаж в каждом месяце.

3. Оформление и стили

3.1. Готовые стили оформления

Matplotlib умеет переключать «тему» одной строкой — для презентации или курсовой.

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 100)

for style in ["default", "ggplot", "seaborn-v0_8-darkgrid", "fivethirtyeight"]:
plt.style.use(style)
plt.plot(x, np.sin(x))
plt.title(f"Стиль: {style}")
plt.show()

Разбор:

  • plt.style.use(style) — глобально меняет шрифты, фон, цвета линий до следующего style.use.
  • Цикл открывает четыре окна подряд — закройте каждое, чтобы увидеть следующее.
  • seaborn-v0_8-darkgrid — имя стиля в новых версиях Matplotlib; если ошибка «style not found», выполните print(plt.style.available).

3.2. Объектно-ориентированный API (рекомендуется для сложных графиков)

Явные fig и ax — стандарт для отчётов и нескольких осей на одном листе.

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 6, 150)
y = np.sin(x)

fig, ax = plt.subplots(figsize=(8, 4.5))
ax.plot(x, y, color="#2a9d8f", linewidth=2.5)
ax.set(xlabel="x", ylabel="sin(x)", title="OO-стиль: fig и ax")
ax.spines["top"].set_visible(False)
ax.spines["right"].set_visible(False)
ax.grid(True, axis="y", alpha=0.4)
fig.tight_layout()
plt.show()

Разбор:

  • fig — всё окно; ax — одна пара осей. Сохранение: fig.savefig(...).
  • ax.set(xlabel=..., ylabel=..., title=...) — три подписи одним вызовом.
  • spines — «рамка» графика; отключение верхней и правой — приём из статистических журналов, меньше визуального шума.
  • grid(True, axis="y") — только горизонтальные линии сетки.

3.3. Scatter с цветом третьего признака

Каждая точка может нести третье число через цвет — например, расстояние от центра или температура.

import matplotlib.pyplot as plt
import numpy as np

rng = np.random.default_rng(7)
n = 200
x = rng.uniform(0, 10, n)
y = rng.uniform(0, 10, n)
c = np.sqrt(x ** 2 + y ** 2)

plt.scatter(x, y, c=c, cmap="viridis", s=40, alpha=0.85)
plt.colorbar(label="Расстояние от начала")
plt.title("Scatter с цветовой кодировкой")
plt.show()

Разбор:

  • c=c — массив длины n: цвет каждой точки берётся из c[i].
  • cmap="viridis" — палитра от тёмного к жёлтому; plasma, coolwarm — другие варианты.
  • s=40 — размер маркера в пунктах².
  • colorbar() — шкала справа: какому цвету какое значение c соответствует.

4. Статистические и аналитические графики

4.1. Ящик с усами (box plot)

Медиана, квартили и выбросы одним рисунком — сравнение трёх групп без гистограмм на каждую.

import matplotlib.pyplot as plt
import numpy as np

rng = np.random.default_rng(0)
data = [
rng.normal(100, 10, 100),
rng.normal(105, 12, 100),
rng.normal(95, 8, 100),
]

plt.boxplot(data, tick_labels=["Группа A", "Группа B", "Группа C"])
plt.ylabel("Значение")
plt.title("Сравнение распределений")
plt.grid(True, axis="y", alpha=0.3)
plt.show()

Разбор:

  • data — список из трёх массивов; каждый массив — одна «коробка».
  • boxplot рисует медиану (линия внутри), ящик Q1–Q3, «усы» и точки-выбросы.
  • tick_labels — подписи групп под осью X.

4.2. Столбцы с погрешностью (yerr)

Среднее ± ошибка измерения — частый формат лабораторной и научной статьи.

import matplotlib.pyplot as plt
import numpy as np

labels = ["A", "B", "C", "D"]
means = [23, 31, 28, 35]
errors = [2.1, 3.0, 2.5, 2.8]

x = np.arange(len(labels))
plt.bar(x, means, yerr=errors, capsize=5, color="slateblue", alpha=0.85)
plt.xticks(x, labels)
plt.ylabel("Среднее")
plt.title("Средние значения ± погрешность")
plt.show()

Разбор:

  • yerr=errors — вертикальные «усики» погрешности на каждом столбце.
  • capsize=5 — горизонтальные черточки на концах усиков (длина в пунктах).
  • xticks(x, labels) — вместо 0,1,2,3 подписи A, B, C, D.

4.3. Тепловая карта (imshow)

Матрица чисел → цвета: корреляции признаков, таблица по дням и часам.

import matplotlib.pyplot as plt
import numpy as np

matrix = np.array([
[1.0, 0.8, 0.3, 0.1],
[0.8, 1.0, 0.5, 0.2],
[0.3, 0.5, 1.0, 0.7],
[0.1, 0.2, 0.7, 1.0],
])

fig, ax = plt.subplots()
im = ax.imshow(matrix, cmap="RdYlBu_r", vmin=0, vmax=1)
ax.set_xticks(range(4))
ax.set_yticks(range(4))
ax.set_xticklabels(["F1", "F2", "F3", "F4"])
ax.set_yticklabels(["F1", "F2", "F3", "F4"])
fig.colorbar(im, ax=ax, label="Корреляция")
ax.set_title("Матрица корреляций")
plt.show()

Разбор:

  • imshow — каждая ячейка матрицы = цвет; строки идут сверху вниз (как в массиве NumPy).
  • vmin=0, vmax=1 — шкала цвета зафиксирована; без этого контраст может «плыть».
  • RdYlBu_r — красный–жёлтый–синий (обратный); _r — reverse палитры.
  • colorbar(im, ax=ax) — легенда цветов привязана к этой оси.

4.4. Стековая диаграмма (stackplot)

Как меняется состав целого во времени: доли каналов, типов трафика.

import matplotlib.pyplot as plt
import numpy as np

years = np.array([2022, 2023, 2024, 2025])
web = np.array([30, 35, 38, 40])
mobile = np.array([25, 28, 32, 36])
api = np.array([15, 18, 22, 24])

plt.stackplot(
years,
web,
mobile,
api,
labels=["Web", "Mobile", "API"],
alpha=0.85,
)
plt.legend(loc="upper left")
plt.xlabel("Год")
plt.ylabel("Доля трафика, %")
plt.title("Структура трафика во времени")
plt.show()

Разбор:

  • stackplot(x, y1, y2, y3) — слои друг на друге; суммарная высота в точке x = web + mobile + api.
  • legend(loc="upper left") — легенда в левом верхнем углу; loc можно "best", "lower right" и т.д.

5. Подписи, аннотации и шкалы

5.1. Подпись экстремума (максимум, минимум)

Стрелка и текст на графике — для пояснения на защите проекта или слайде.

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 300)
y = np.sin(x)
peak_idx = np.argmax(y)
peak_x, peak_y = x[peak_idx], y[peak_idx]

plt.plot(x, y)
plt.scatter([peak_x], [peak_y], color="red", zorder=5)
plt.annotate(
f"max = {peak_y:.2f}",
xy=(peak_x, peak_y),
xytext=(peak_x + 1.5, peak_y - 0.3),
arrowprops=dict(arrowstyle="->", color="gray"),
)
plt.title("Поиск и подпись экстремума")
plt.grid(True, alpha=0.3)
plt.show()

Разбор:

  • np.argmax(y) — индекс максимального элемента в массиве y.
  • peak_x, peak_y = x[peak_idx], y[peak_idx] — координаты пика на графике.
  • scatter([peak_x], [peak_y]) — выделить точку красным; zorder=5 — рисовать поверх линии.
  • annotate(...) — текст xytext со стрелкой к точке xy; f"max = {peak_y:.2f}" — два знака после запятой.

5.2. Логарифмическая шкала

Когда числа разбросаны на несколько порядков (1, 10, 1000, 1000000) — обычная ось сжимает мелкие значения.

import matplotlib.pyplot as plt
import numpy as np

x = np.logspace(0, 4, 50)
y = x ** 1.5

plt.loglog(x, y, marker="o", markersize=4)
plt.xlabel("X (log)")
plt.ylabel("Y (log)")
plt.title("Степенная зависимость на log-log")
plt.grid(True, which="both", alpha=0.3)
plt.show()

Разбор:

  • np.logspace(0, 4, 50) — 50 точек от 10⁰=1 до 10⁴=10000 логарифмически равномерно.
  • loglog — логарифм по обеим осям; прямая на таком графике часто означает степенной закон y ∝ x^1.5.
  • which="both" у сетки — линии для основных и промежуточных делений.

5.3. Даты на оси X (временной ряд)

Продажи по дням, температура, курс валюты — ось X из объектов datetime.

import matplotlib.pyplot as plt
import numpy as np
from datetime import datetime, timedelta

start = datetime(2025, 1, 1)
dates = [start + timedelta(days=i) for i in range(30)]
values = np.cumsum(np.random.default_rng(3).normal(0, 1, 30)) + 100

fig, ax = plt.subplots()
ax.plot(dates, values, marker=".")
fig.autofmt_xdate()
ax.set_title("Временной ряд")
ax.set_ylabel("Метрика")
ax.grid(True, alpha=0.3)
plt.show()

Разбор:

  • timedelta(days=i) — i-й день от стартовой даты; список из 30 дат подряд.
  • np.cumsum(...) — накопительная сумма случайных шагов → «блуждающая» кривая вокруг 100.
  • autofmt_xdate() — наклоняет подписи дат, чтобы не налезали друг на друга.
  • Matplotlib сам понимает datetime на оси X — отдельный конвертер не нужен.

6. Специальные типы графиков

6.1. Полярная диаграмма

Угол θ и радиус r вместо x и y — розы ветров, диаграммы направлений.

import matplotlib.pyplot as plt
import numpy as np

theta = np.linspace(0, 2 * np.pi, 360)
r = 1 + 0.3 * np.sin(5 * theta)

fig, ax = plt.subplots(subplot_kw={"projection": "polar"})
ax.plot(theta, r, color="purple")
ax.set_title("Роза в полярных координатах")
plt.show()

Разбор:

  • projection="polar" — ось в виде круга; первый аргумент plot — угол в радианах, второй — радиус.
  • 5 * theta в sin — пять «лепестков» за оборот.

6.2. Контурный график (линии уровня)

Функция двух переменных z = f(x, y) — топографическая карта высот или потенциала.

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-3, 3, 120)
y = np.linspace(-3, 3, 120)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) * np.cos(Y)

fig, ax = plt.subplots()
contour = ax.contour(X, Y, Z, levels=12, cmap="coolwarm")
ax.clabel(contour, inline=True, fontsize=8)
ax.set_title("Линии уровня sin(x)·cos(y)")
plt.show()

Разбор:

  • meshgrid — двумерные сетки X и Y: в каждой точке (xi, yj) считаем Z.
  • contour(..., levels=12) — 12 линий уровня; точки на одной линии имеют одинаковое Z.
  • clabel — подписи значения Z на линиях.

6.3. 3D-поверхность

Объёмный график функции двух переменных; модуль mplot3d в составе Matplotlib.

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-5, 5, 60)
y = np.linspace(-5, 5, 60)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X ** 2 + Y ** 2))

fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, projection="3d")
ax.plot_surface(X, Y, Z, cmap="viridis", edgecolor="none", alpha=0.9)
ax.set_title("3D-поверхность")
plt.show()

Разбор:

  • sqrt(X**2 + Y**2) — расстояние от центра; sin от него даёт «волну» от центра.
  • plot_surface — цветная поверхность; edgecolor="none" убирает сетку граней для гладкого вида.
  • Окно можно крутить мышью (если интерактивный backend).

7. Анимация

7.1. Движущаяся синусоида

Кадр за кадром меняем данные линии — основа GIF и простых симуляций.

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.animation import FuncAnimation

fig, ax = plt.subplots()
x = np.linspace(0, 2 * np.pi, 200)
(line,) = ax.plot(x, np.sin(x))
ax.set_ylim(-1.2, 1.2)
ax.grid(True, alpha=0.3)


def update(frame):
line.set_ydata(np.sin(x + frame / 10))
return (line,)


anim = FuncAnimation(fig, update, frames=120, interval=50, blit=True)
plt.show()

Разбор:

  • (line,) = ax.plot(...) — запятая создаёт кортеж из одного объекта Line2D; нужно для blit.
  • update(frame) вызывается frames раз; frame — номер кадра 0, 1, 2, …
  • frame / 10 — фаза синуса сдвигается → волна «бежит».
  • interval=50 — 50 мс между кадрами (~20 FPS).
  • blit=True — перерисовывается только линия, быстрее на слабых ПК.

Сохранение: anim.save("wave.gif", writer="pillow") — нужен пакет pillow. Для MP4 — ffmpeg в системе.


8. Экспорт и публикация

8.1. Сохранение в PNG и PDF

График в файл — для Word, LaTeX, презентации, сдачи на платформу. Вставка PDF в .tex-отчёт — LaTeX — формулы для отчётов.

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 100)
y = np.cos(x)

fig, ax = plt.subplots(figsize=(6, 4), dpi=120)
ax.plot(x, y, linewidth=2)
ax.set_title("График для отчёта")
fig.tight_layout()
fig.savefig("report_plot.png", bbox_inches="tight")
fig.savefig("report_plot.pdf")
plt.show()

Разбор:

  • figsize=(6, 4) — размер в дюймах; вместе с dpi=120 PNG получится примерно 720×480 пикселей.
  • savefig до или после show() — оба варианта работают; часто сохраняют перед показом.
  • bbox_inches="tight" — обрезка пустых полей по краям.
  • PDF — вектор: при печати не «мылится», как растровый PNG.

8.2. PNG с прозрачным фоном

Вставка графика на цветной слайд или сайт без белого прямоугольника.

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 6, 100)
plt.plot(x, np.sin(x), color="navy", linewidth=3)
plt.axis("off")
plt.savefig("sin_transparent.png", transparent=True, bbox_inches="tight", pad_inches=0.1)
plt.show()

Разбор:

  • axis("off") — скрыть оси, рамку и подписи; остаётся только линия.
  • transparent=True — фон PNG прозрачный (альфа-канал).
  • pad_inches=0.1 — узкая рамка вокруг линии при обрезке.

9. Переиспользуемые базы

9.1. Шаблон для экспериментов

Один раз настроили размер и стиль — дальше только меняете данные.

def setup_figure(
title: str = "Matplotlib experiment",
width: float = 8.0,
height: float = 5.0,
style: str = "seaborn-v0_8-whitegrid",
) -> tuple:
import matplotlib.pyplot as plt

plt.style.use(style)
fig, ax = plt.subplots(figsize=(width, height))
ax.set_title(title)
return fig, ax


# Пример использования:
fig, ax = setup_figure("Мой график")
ax.plot([1, 2, 3], [1, 4, 9])
plt.show()

Разбор:

  • Функция возвращает (fig, ax) — дальше рисуете через ax.plot, ax.set_xlabel и т.д.
  • Параметры со значениями по умолчанию — можно вызвать setup_figure() без аргументов.

9.2. Сброс состояния pyplot

В Jupyter старые фигуры «висят» в памяти — перед новым графиком полезно очистить.

import matplotlib.pyplot as plt

def reset_pyplot():
plt.close("all")
plt.clf()
plt.cla()

Разбор:

  • close("all") — закрыть все окна Figure.
  • clf() — clear figure текущего окна; cla() — clear axes (очистить оси).

Частые задания из школы и вуза

ЗаданиеЧто взять из этой страницы
Построить график y = sin xЛинейный график
Построить параболу y = x²График параболы
Столбчатая диаграмма по таблицеСтолбчатая диаграмма
Гистограмма оценок классаГистограмма
Два графика на одном рисункеСетка 2×2 или несколько функций
Сохранить график в файл для отчётаPNG и PDF
Как сдавать работу

Сохраните PNG через fig.savefig("grafik.png", dpi=150, bbox_inches="tight"), вставьте в Word или Google Docs. Подписи осей и заголовок на графике должны совпадать с формулировкой в задании — преподаватель сверяет именно это.


См. также


См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").