Графики в Python: matplotlib и pyplot на примерах

опубликовано
читать
≈ 4 мин
автор
среда и версия
matplotlib 3.10.8 в песочнице Koddo — Python 3.14.2 в браузере, пакет скачивается при первом import. Каждый пример запущен там, графики и тексты ошибок сверены
содержание решать задачи Продуктовая аналитика «Пульс»

matplotlib — главная библиотека для графиков в Python. Линии, столбцы, точки и гистограммы рисует её модуль pyplot, поэтому почти любая программа с графиком начинается строкой import matplotlib.pyplot as plt. Под каждым примером — ссылка «запустить в песочнице»: там matplotlib скачается сам при первом import, и график появится в терминале. Ставить ничего не нужно.

Python / 01

Figure — вся картинка, Axes — область с графиком

Figure — вся картинка, Axes — область с графикомСлева схема графика температуры за неделю. Внешняя рамка, шаг 1, — Figure, вся картинка; её размер задаёт plt.figure(figsize=(8, 4)). Внутри — рамка Axes, область с осями, где plt.plot(days, temps), шаг 2, рисует линию. Шаг 3: над Axes заголовок от plt.title, под осью x подпись «день» от plt.xlabel, слева подпись «°C» от plt.ylabel. Шаг 4: plt.show() показывает готовую картинку.01 / график02 / команды123Температура за неделюдень°C1plt.figure(figsize=(8, 4))Figure — вся картинка2plt.plot(days, temps)линия внутри Axes3title, xlabel, ylabelзаголовок и подписи осей4plt.show()показать готовую картинку
Figure — вся картинка, её размер задаёт figsize. Внутри — Axes: область с осями, где plot рисует линию, а заголовок и подписи осей стоят вокруг неё. plt.show() показывает готовый результат.

Первый график: plt.plot

import matplotlib.pyplot as plt

days = ["пн", "вт", "ср", "чт", "пт", "сб", "вс"]
temps = [12, 15, 14, 18, 21, 19, 16]

plt.plot(days, temps)
plt.title("Температура за неделю")
plt.xlabel("день")
plt.ylabel("°C")
plt.show()

plt.plot(days, temps) соединяет точки линией: по горизонтали — значения из первого списка, по вертикали — из второго, поэтому списки должны быть одной длины. title, xlabel и ylabel подписывают график и оси, а plt.show() показывает картинку: в программе без него график не появится.

import matplotlib.pyplot as plt

matplotlib — пакет целиком, pyplot — его модуль с командами «нарисуй линию», «подпиши ось», «покажи». as plt даёт модулю короткое имя: так пишут почти во всех примерах и в документации. На компьютер matplotlib ставят командой python -m pip install matplotlib. Если после этого Python отвечает No module named 'matplotlib', пакет попал в другой интерпретатор — как это найти и исправить, разобрано в статье про ModuleNotFoundError на примере pandas, для matplotlib всё так же.

Размер картинки: figsize

import matplotlib.pyplot as plt

days = ["пн", "вт", "ср", "чт", "пт"]
steps = [4200, 7600, 5100, 9800, 8300]

plt.figure(figsize=(8, 4))
plt.bar(days, steps, color="tab:orange")
plt.title("Шаги за неделю")
plt.show()

plt.figure(figsize=(8, 4)) создаёт картинку 8 на 4 дюйма — вдвое шире, чем выше. Вызывай его до того, как рисовать: следующие команды рисуют уже на этой картинке. plt.bar строит столбцы, а color="tab:orange" красит их цветом из палитры matplotlib.

Точки: plt.scatter

import matplotlib.pyplot as plt

heights = [158, 162, 170, 175, 181, 187]
weights = [52, 58, 66, 70, 79, 85]

plt.scatter(heights, weights)
plt.xlabel("рост, см")
plt.ylabel("вес, кг")
plt.show()

scatter ставит точку для каждой пары значений и ничего не соединяет: так видно, связаны ли две величины. Здесь точки идут вверх слева направо — чем больше рост, тем больше вес.

Гистограмма: plt.hist

import matplotlib.pyplot as plt

scores = [3, 4, 4, 5, 5, 5, 3, 4, 2, 5, 4, 4, 3, 5, 4]

plt.hist(scores, bins=[1.5, 2.5, 3.5, 4.5, 5.5], edgecolor="black")
plt.xticks([2, 3, 4, 5])
plt.title("Оценки за контрольную")
plt.show()

Гистограмма считает, сколько значений попало в каждый интервал. bins задаёт границы интервалов: с половинками каждая оценка попадает в свой столбик, а xticks подписывает ось целыми числами. Столбики выйдут высотой 1, 3, 6 и 5: одна двойка, три тройки, шесть четвёрок и пять пятёрок.

Несколько линий, легенда и сетка

import matplotlib.pyplot as plt

months = ["янв", "фев", "мар", "апр", "май"]
plan = [100, 110, 120, 130, 140]
fact = [95, 118, 115, 138, 151]

plt.plot(months, plan, linestyle="--", label="план")
plt.plot(months, fact, marker="o", label="факт")
plt.legend()
plt.grid(True)
plt.show()

Каждый plot добавляет на картинку ещё одну линию. label даёт ей имя, а plt.legend() выводит имена в рамке. linestyle="--" рисует пунктир, marker="o" ставит кружок в каждой точке, а plt.grid(True) добавляет сетку — по ней легче читать значения.

Два графика рядом: subplots

import matplotlib.pyplot as plt

fig, (left, right) = plt.subplots(1, 2, figsize=(10, 4))
left.plot([1, 2, 3, 4], [1, 4, 9, 16])
left.set_title("квадраты")
right.bar(["A", "B", "C"], [5, 3, 7])
right.set_title("столбцы")
fig.tight_layout()
plt.show()

plt.subplots(1, 2) создаёт картинку с одной строкой и двумя областями для графиков, у каждой свои оси. Рисуют уже не через plt, а через саму область: left.plot, right.bar. Заголовок области задаёт set_title, а fig.tight_layout() раздвигает области, чтобы подписи не налезали друг на друга.

Сохранить в файл: savefig

import matplotlib.pyplot as plt

plt.plot([1, 2, 3], [2, 4, 1])
plt.savefig("chart.png", dpi=150)
plt.show()

plt.savefig("chart.png", dpi=150) записывает картинку в файл рядом с программой; dpi — плотность точек: чем она больше, тем чётче картинка. Вызывай savefig до show: show показывает картинку и закрывает её, и после него сохранится пустой белый файл. В песочнице сохранённый файл появляется в терминале со ссылкой «скачать».

Частые ошибки

График не появился. В программе нет plt.show(). В Jupyter Notebook график рисуется под ячейкой и без него, а программа на компьютере и в песочнице заканчивается, так и не показав картинку.

Списки разной длины. plt.plot([1, 2, 3], [1, 2]) падает:

ValueError: x and y must have same first dimension, but have shapes (3,) and (2,)

У каждого значения по горизонтали должна быть пара по вертикали: сверь длины списков через len().

В файле пустая картинка. savefig вызван после show — поменяй их местами.

No module named 'matplotlib'. matplotlib не установлен в тот Python, которым запускаешь программу: поставь его командой python -m pip install matplotlib. Подробности — в разборе ModuleNotFoundError. В песочнице Python ставить ничего не нужно.

Источники