Нашли ошибку?
Скачать чистый
урок 1 из 3≈ 20 минупражнения: 0 из 4

Графики

Метод .plot строит график прямо из Series или таблицы: линия — для изменения во времени, столбцы — для сравнения категорий, гистограмма — для распределения. Заголовок, подписи осей и несколько рядов на одном графике.

Python запустится при первом выполнении

Двенадцать чисел месячной выручки можно прочитать глазами. Триста шестьдесят пять дневных — уже нет. График показывает то, что в таблице не разглядеть: рост и спад, всплески, необычные значения. В pandas график строится одним методом — plot. Рисует его библиотека matplotlib; pandas лишь передаёт ей данные.

[ ]Выручка по месяцам
import pandas as pd

orders = pd.read_csv("data/shop_orders.csv", parse_dates=["date"])
orders["revenue"] = orders["price"] * orders["quantity"]
orders["month"] = orders["date"].dt.month
monthly = orders.groupby("month")["revenue"].sum()
monthly.head(3)
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
month
1    318940
2    250430
3    297780
Name: revenue, dtype: int64

Линия

[ ]Первый график
monthly.plot()
Выводсохранённый · нажмите «Выполнить», чтобы получить свойГрафик: Первый график

По горизонтали — индекс, по вертикали — значения; подпись горизонтальной оси — название индекса (month). Линия — вид графика по умолчанию; она подходит, когда точки идут по порядку и между соседними есть смысл проводить отрезок: время, возраст, расстояние.

График без подписей — полуфабрикат. Заголовок задаёт параметр title. Метод plot возвращает объект осей (axes) — сам график; его сохраняют в переменную и подписывают оси методами set_xlabel и set_ylabel:

[ ]Заголовок и подписи осей
ax = monthly.plot(title="Выручка по месяцам, 2025")
ax.set_xlabel("месяц")
ax.set_ylabel("₽")
Выводсохранённый · нажмите «Выполнить», чтобы получить свойГрафик: Заголовок и подписи осей
[ ]Упражнение 1Штуки по месяцам решено

В items — число проданных штук по месяцам. Постройте линейный график с заголовком «Продано штук по месяцам» и сохраните его в ax. Подпишите ось Y словом «штук».

items = orders.groupby("month")["quantity"].sum()
ax = ...

Столбцы

Если на оси не время, а категории, линия вводит в заблуждение:

[ ]Так не надо
by_category = orders.groupby("category")["revenue"].sum()
by_category.plot(title="Линия для категорий — плохая идея")
Выводсохранённый · нажмите «Выполнить», чтобы получить свойГрафик: Так не надо

Наклон линии между «Аксессуарами» и «Кофе» ничего не значит: у категорий нет порядка и нет ничего «между». Для сравнения категорий нужны столбцы — kind="bar":

[ ]Столбчатая диаграмма
by_category.sort_values(ascending=False).plot(kind="bar", title="Выручка по категориям", rot=0)
Выводсохранённый · нажмите «Выполнить», чтобы получить свойГрафик: Столбчатая диаграмма

Два приёма делают её читаемой. Сортировка перед построением — глаз сразу видит порядок. И rot=0 — подписи горизонтально (по умолчанию они повёрнуты набок).

Когда категорий много или названия длинные, столбцы кладут горизонтально — kind="barh":

[ ]Горизонтальные столбцы
by_product = orders.groupby("product")["revenue"].sum().sort_values()
by_product.tail(8).plot(kind="barh", title="Восемь товаров с наибольшей выручкой")
Выводсохранённый · нажмите «Выполнить», чтобы получить свойГрафик: Горизонтальные столбцы

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

[ ]Упражнение 2Города решено

Сохраните в by_city выручку по городам по убыванию. Постройте столбчатую диаграмму с заголовком «Выручка по городам» и сохраните в ax.

by_city = ...
ax = ...

Гистограмма

Третий частый вопрос — как значения распределены: каких много, каких мало. Гистограмма делит диапазон значений на интервалы равной ширины и показывает, сколько значений попало в каждый. Это графический pd.cut с value_counts.

[ ]Распределение выручки строки
orders["revenue"].plot(kind="hist", bins=30, title="Выручка одной строки заказа")
Выводсохранённый · нажмите «Выполнить», чтобы получить свойГрафик: Распределение выручки строки

По вертикали matplotlib пишет Frequency — «частота», число значений в интервале. Сразу видно то, о чём говорили среднее и медиана: большинство строк — до 2000 ₽, а вправо тянется длинный «хвост» редких крупных покупок. Параметр bins задаёт число интервалов; по умолчанию их десять.

Вопрос

Гистограмма pd.Series([1, 2, 2, 3, 3, 3]).plot(kind="hist", bins=3) состоит из трёх столбцов. Какой высоты самый высокий?

[ ]Упражнение 3Температура в Москве решено

Сохраните в moscow_temp столбец temp_max для Москвы. Постройте гистограмму из 20 интервалов с заголовком «Дневной максимум в Москве» и сохраните в ax. Подпишите ось X: «°C».

weather = pd.read_csv("data/weather.csv", parse_dates=["date"])
moscow_temp = ...
ax = ...

У гистограммы два «горба» — чуть ниже нуля и около двадцати градусов: зима и лето. Среднее (9 градусов) попадает в провал между ними: дней с такой температурой в два-три раза меньше, чем на вершинах. Одно число этого не покажет.

Пояснение с ответом появится, когда решите упражнение «Температура в Москве».

Несколько рядов

У таблицы plot рисует по линии на каждый столбец и сам добавляет легенду:

[ ]Выручка: месяцы × каналы
by_channel = orders.pivot_table(values="revenue", index="month", columns="channel", aggfunc="sum")
by_channel.head(3)
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
channel маркетплейс приложение сайт
month
1 81700 106380 130860
2 66650 50450 133330
3 86720 96070 114990
[ ]Три линии
by_channel.plot(title="Выручка по каналам")
Выводсохранённый · нажмите «Выполнить», чтобы получить свойГрафик: Три линии

Поэтому перед графиком данные часто приводят к широкой форме: то, что должно стать отдельными линиями, — в столбцы.

Добавить линию на уже готовый график позволяет параметр ax: ему передают оси, на которых нужно рисовать. Параметр alpha делает линию полупрозрачной:

[ ]Дневная выручка и скользящее среднее
daily = orders.groupby("date")["revenue"].sum().reindex(pd.date_range("2025-01-01", "2025-12-31"), fill_value=0)
ax = daily.plot(title="Выручка по дням и среднее за 7 дней", alpha=0.35)
daily.rolling(7).mean().plot(ax=ax)
Выводсохранённый · нажмите «Выполнить», чтобы получить свойГрафик: Дневная выручка и скользящее среднее

Бледная линия — шумные дневные значения, яркая — среднее за неделю. Раз в индексе настоящие даты, matplotlib сам подписал ось месяцами — по-английски (Jan, Feb…). На ней видны весенний подъём, летний спад и декабрьский пик.

[ ]Упражнение 4Климат трёх городов решено

Первая строка заготовки добавляет в weather столбец month. Соберите month_temp — сводную таблицу среднего temp_max: месяцы в строках, города в столбцах. Постройте график для столбцов «Сочи», «Москва», «Новосибирск» (в этом порядке) с заголовком «Средний дневной максимум по месяцам», сохраните в ax и подпишите ось Y: «°C».

weather["month"] = weather["date"].dt.month
month_temp = ...
ax = ...

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

Вопрос График kind
Как менялось во времени? линия "line" (по умолчанию)
Что больше, что меньше? столбцы "bar", "barh"
Как распределены значения? гистограмма "hist"

Итоги

  • ряд.plot() — линия; kind="bar" — столбцы, kind="hist" — гистограмма.
  • По горизонтали — индекс: сделайте индексом то, что должно быть на оси.
  • title=, ax.set_xlabel(...), ax.set_ylabel(...) — подписи; без них график непонятен.
  • У таблицы каждый столбец — отдельная линия.
  • Линия — для времени, столбцы — для категорий, гистограмма — для распределения.

Подробнее в справочнике

Нашли ошибку?