Matplotlib — графики
Основы графиков на Python
Matplotlib — главная библиотека Python для построения графиков: линии, столбцы, точки, гистограммы, круговые диаграммы. Её используют в школе (график функции, лабораторная по физике), в вузе (курсовые, статистика) и на работе (отчёты, анализ данных).
Теория — Matplotlib — графики (архитектура, pyplot, экспорт). Массивы для осей X и Y — примеры NumPy. Символьные формулы (корни, производные) перед графиком — SymPy — уравнения и производные. Таблицы перед графиком — примеры Pandas, NumPy и pandas. Рисование фигур «от руки» — примеры Turtle (Python) или p5.js (браузер). Здесь — графики по числам: оси X и Y, подписи, легенда.
Как запустить пример
- Установите библиотеки (один раз в терминале или командной строке):
pip install matplotlib numpy
- Скопируйте код в файл, например
grafik.py. - Запустите:
python grafik.py— откроется окно с графиком. - В 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=120PNG получится примерно 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. Подписи осей и заголовок на графике должны совпадать с формулировкой в задании — преподаватель сверяет именно это.
См. также
- Matplotlib — графики — теория, API, экспорт
- Анализ данных и научные вычисления — NumPy, Pandas, Seaborn, Plotly
- Python для анализа данных — описательная статистика и визуализация
- LaTeX — формулы для отчётов — оформление формул в PDF
- SymPy — уравнения и производные — решение уравнений и производные в Python
- Примеры фигур Turtle на Python — 2D-рисование через turtle
- Примеры фигур Panda3D на Python — 3D-сцены
- Tkinter — окна и виджеты — формы и кнопки; график Matplotlib можно встроить в то же окно (319)
См. также
Другие статьи этого же раздела в боковом меню (как на странице "О разделе"). Практическая карта типовых IT-задач: термины, пошаговое внедрение, проверка качества и типичные ошибки. Простой консольный чат на C# — учебное приложение с сокетами: TCP между клиентом и сервером, многопоточность и обмен сообщениями в консоли. Примеры вёрстки на HTML и CSS с разбором: центрирование, Flexbox, Grid, формы, шапка, подвал и адаптив для учебы и портфолио. Перед началом работы обязательно изучите главу Turtle . Галерея 3D-фигур на Panda3D — карточки, куб, пирамида, сфера, сетки и составные сцены; код для локального запуска. Готовые docker-compose.yml с разбором каждой строки — nginx, PostgreSQL, Redis, WordPress, MongoDB. Примеры для школьников и студентов: postgres example, поднять базу локально, app + db. Примеры nginx.conf для статики, reverse proxy, React/Vue SPA, PHP, SSL и балансировки — построчный разбор директив, проверка curl и типичные ошибки для лабораторных и VPS. dockerfile example — 10 готовых Dockerfile с построчным разбором: node, python, golang, react nginx, spring boot, php, dotnet. Для студентов, лабораторных и docker build с нуля. PromQL example — готовые запросы Prometheus и Grafana с построчным разбором: up, rate, node_exporter cpu, memory, disk, http_requests_total, histogram_quantile p99, алерты. Для студентов, лабораторных и devops docker compose. Готовые манифесты Kubernetes с разбором каждой строки — Pod, Deployment, Service, ConfigMap, Secret, Ingress. Примеры для Minikube, kind и kubectl apply. Примеры pandas на Python для школьников и студентов — DataFrame, фильтрация, groupby, очистка, merge, сводные таблицы и экспорт; код с подробным разбором каждой строки. p5.js и Processing — готовый код фигур с подробным разбором каждой строки: квадрат, треугольник, цветок, снежинка, фракталы, анимация; для школьников и студентов.Готовые решения
Простой консольный чат на CSharp
HTML + CSS — готовые макеты
Примеры фигур Turtle на Python
Примеры фигур Panda3D на Python
Docker Compose — готовые стеки
Nginx — конфиги под задачу
Dockerfile — 10 типовых образов
Prometheus + Grafana — запросы
Kubernetes YAML — минимальные манифесты
Pandas — типовые операции
Примеры фигур на Processing/p5.js