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

Matplotlib — графики

Разработчику

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

Эта глава — теория и минимальные примеры. Готовая галерея скриптов с разбором каждой строки — Matplotlib — графики (примеры).

Что читать до и после

База Python — первая программа, точка входа main, venv и pip install. Массивы для осей X и Y — примеры NumPy. Таблицы перед графиком — примеры Pandas, NumPy и pandas. Символьные формулы (корни, производная f′) перед построением кривой — SymPy — уравнения и производные. Рисование фигур «от руки» — Turtle, в браузере — SVG или p5.js; статистические графики поверх Matplotlib — Seaborn в том же разделе.


Matplotlib и другая «графика» в Python

В Python слово «графика» встречается в разных контекстах. Matplotlib решает задачу диаграмм и графиков функций, а не игр или векторного рисования.

ИнструментЧто рисуемТипичная задача
MatplotlibГрафики по осям X и Ysin(x), продажи по месяцам, гистограмма оценок
TurtleЛинии и фигуры «черепашкой»Квадрат, снежинка, узор в цикле
Panda3D3D-сценыКуб, текстуры, игровой мир
Pygame2D-игрыСпрайты, коллизии, счёт
SeabornСтатистика поверх Matplotlibbox plot, heatmap корреляций
PlotlyИнтерактив в браузереДашборд с zoom и подсказками

Turtle учит координатам и циклам через движение пера. Matplotlib учит представлять таблицы и формулы как картинку для отчёта. Обе темы полезны новичку; для поиска «построить график sin python» нужен именно Matplotlib.


Установка

Matplotlib не входит в минимальную поставку Python — пакет ставят через pip:

pip install matplotlib numpy

Разбор:

  • matplotlib — сама библиотека графиков.
  • numpy — массивы и sin, cos, linspace; почти все учебные примеры используют оба пакета.

В проекте зависимости фиксируют в requirements.txt (см. главу про venv и зависимости):

matplotlib>=3.8
numpy>=1.26

Архитектура

Matplotlib унаследовал модель из MATLAB. Полезно держать в голове три уровня:

ОбъектРоль
FigureОкно или «лист» — контейнер верхнего уровня
AxesОбласть с осями X и Y, куда наносятся данные
ArtistВсё, что видно: линия, текст, легенда, сетка

Схема для одного простого графика:

Figure
└── Axes
├── line (plot)
├── xlabel, ylabel, title
├── legend
└── grid

Pyplot и объектный стиль

Процедурный интерфейс matplotlib.pyplot (импорт as plt) — короткие команды в духе MATLAB:

import matplotlib.pyplot as plt

plt.plot([1, 2, 3], [1, 4, 9])
plt.title("Парабола")
plt.show()

Объектный стиль — явные fig и ax; рекомендуется для отчётов, подграфиков и встраивания в GUI:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot([1, 2, 3], [1, 4, 9])
ax.set_title("Парабола")
fig.savefig("parabola.png")
plt.show()

Разбор:

  • plt.subplots() создаёт пару Figure + Axes.
  • ax.plot(...) рисует на конкретных осях — так проще несколько графиков на одном листе без путаницы «какой plt сейчас активен».
  • fig.savefig(...) сохраняет фигуру, а не «текущее окно» pyplot.
С чего начать кодить

Первые 10–20 скриптов — через plt.plot и plt.show(). Как только понадобятся два графика рядом или сохранение в файл — переходите на fig, ax = plt.subplots().


Первый график

Минимальный рабочий скрипт — линейный график функции:

import matplotlib.pyplot as plt
import numpy as np

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

plt.plot(x, y, label="sin(x)")
plt.xlabel("x")
plt.ylabel("sin(x)")
plt.title("Синусоида")
plt.legend()
plt.grid(True)
plt.show()

Разбор:

  • np.linspace(0, 10, 100) — 100 равномерных точек от 0 до 10; линия гладкая.
  • np.sin(x) — синус для всех x сразу (векторизация NumPy).
  • plt.plot(x, y, label=...) — линия; label нужен для легенды.
  • xlabel, ylabel, title — подписи; в учебной работе без них график считают неоформленным.
  • legend() — расшифровка серий.
  • grid(True) — координатная сетка.
  • show() — показ окна; в .py-файле без неё окно может сразу закрыться.

Парабола без NumPy: x = list(range(-5, 6)), y = [i**2 for i in x] — см. примеры.


Типы графиков

ЗадачаФункцияКогда выбирать
График функции, тренд во времениplotНепрерывная линия, sin, cos, температура по дням
Сравнение категорийbar, barhОценки по предметам, популярность языков
Связь двух переменныхscatterРост и вес, эксперимент «x vs y»
Распределение значенийhistСколько учеников получили 3, 4, 5
Доли от 100%pieБюджет, состав команды (до 5–6 секторов)
Несколько графиковsubplotsОтчёт: 4 диаграммы на одном листе
Матрица чиселimshowТепловая карта корреляций

Подробные скрипты с разбором — в галерее примеров.


Справочник частых команд pyplot

ДействиеВызов
Линияplt.plot(x, y)
Столбцыplt.bar(categories, values)
Точкиplt.scatter(x, y)
Гистограммаplt.hist(data, bins=20)
Круговаяplt.pie(sizes, labels=labels)
Подпись оси Xplt.xlabel("текст")
Заголовокplt.title("текст")
Легендаplt.legend()
Сеткаplt.grid(True)
Пределы осиplt.xlim(0, 10), plt.ylim(-1, 1)
Сохранитьplt.savefig("out.png", dpi=150, bbox_inches="tight")
Показатьplt.show()

Объектный эквивалент: ax.plot, ax.set_xlabel, ax.set_title, fig.savefig.


NumPy и Pandas

NumPy готовит числа для осей (подробнее — примеры NumPy в Lab):

import numpy as np

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

Pandas часто строит график одной строкой — под капотом тот же Matplotlib:

import pandas as pd

df = pd.DataFrame({"month": [1, 2, 3], "sales": [40, 55, 48]})
df.plot(x="month", y="sales", kind="line", legend=False)

Разбор:

  • df.plot(...) — быстрый EDA (exploratory data analysis) без ручного plt.plot.
  • Для курсовой и публикации график из Pandas обычно донастраивают через ax = df.plot(...) и методы ax.set_... или через plt.gca().

Типовые операции с таблицами — Pandas в лаборатории и раздел 33.


Скрипт, Jupyter и Google Colab

СредаПоведение show()
Файл python grafik.pyОткрывает окно, ждёт закрытия
Jupyter / ColabГрафик под ячейкой; %matplotlib inline в старых ноутбуках
Сохранение без окнаТолько savefig, без show() — для CI и серверов

На сервере без дисплея (headless) используют backend Agg:

import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt

Разбор:

  • Agg рисует в файл, окно не создаётся — типично для cron-отчётов и Docker.

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

plt.style.use("seaborn-v0_8-whitegrid")
plt.plot(x, y)

Разбор:

  • style.use(...) меняет фон, шрифты и цвета глобально.
  • Список имён: print(plt.style.available).

Цвет линии задают параметром color, c или hex #2a9d8f. Толщина — linewidth или lw. Прозрачность — alpha от 0 до 1.


Экспорт в файл

fig, ax = plt.subplots(figsize=(6, 4), dpi=120)
ax.plot(x, y)
fig.tight_layout()
fig.savefig("report.png", bbox_inches="tight")
fig.savefig("report.pdf")

Разбор:

  • figsize — размер в дюймах; с dpi=120 PNG ≈ 720×480 px.
  • tight_layout() — поджимает отступы, подписи не обрезаются.
  • bbox_inches="tight" — обрезка пустых полей при сохранении.
  • PDF — вектор для Word, LaTeX и печати; вставка графика в отчёт — LaTeX — формулы для отчётов.

Связь с Seaborn и Plotly

Seaborn строит статистические графики (ящик с усами, pairplot, heatmap) и использует Matplotlib как движок. После sns.boxplot(...) можно взять текущие оси и донастроить подписи:

import seaborn as sns
import matplotlib.pyplot as plt

sns.boxplot(x="class", y="score", data=df)
plt.title("Оценки по классам")
plt.show()

Plotly — интерактивность в браузере; для статичной сдачи работы в школе чаще хватает Matplotlib. Сравнение трёх библиотек — в разделе 33.


Интеграция с Turtle и Tkinter

Matplotlib и Turtle решают разные задачи, но оба могут жить в одном окне Tkinter — например, график функции слева и черепашья траектория справа. Пример сборки — в справочнике Turtle. Базовые виджеты окна (кнопки, Frame, mainloop) — в Tkinter — окна и виджеты; теория GUI — 311.md.


Типичные ошибки

Если «не работает»
  • Окно мелькает и закрывается — добавьте plt.show() в конец скрипта.
  • Разная длина x и y — массивы должны совпадать по числу элементов.
  • Кириллица квадратиками — настройте шрифт (DejaVu Sans или системный с поддержкой русского).
  • Пустой график в Jupyter — выполните ячейку заново; при необходимости %matplotlib inline.
  • ModuleNotFoundError: matplotlibpip install matplotlib в том же venv, откуда запускаете Python.

Ограничения

Matplotlib рассчитан на статичные 2D- и простые 3D-графики (модуль mplot3d). Для интерактивных дашбордов с zoom — Plotly или Dash. Для миллионов точек без агрегации — Datashader или предварительный binning в Pandas. Для игр и анимации персонажей — Pygame или Panda3D, не pyplot.

Производительность: тысячи точек на plot — нормально; десятки тысяч scatter-точек могут тормозить интерактивное окно — уменьшите выборку или используйте alpha и растр.


См. также


См. также

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