Перейти к содержанию

252 уроков, 17 библиотек и челлендж «Что выведет код?» — бесплатно, код прямо в браузере

Начать обучение
Урок 6 из 20 Средний 30 мин 130 XP

lineplot в Seaborn: ряды, тренды и полоса доверия

lineplot соединяет точки линией, когда по оси X идёт время: тренд, несколько городов на одном графике и полоса доверия вокруг среднего при повторных измерениях.

Редакция Питоники

Синоптики ведут журнал две недели: Сочи против Казани, каждый день — строка таблицы. Числа в столбце показывают температуру, но не показывают движение: растёт ли тепло, где холоднее и насколько уверенно мы это утверждаем. Всё это даёт lineplot — главный график для рядов, где по оси X идёт время или порядок.

Данные: температура двух городов

10 дней наблюдений
import pandas as pd

week = pd.DataFrame({
    "day": list(range(1, 11)),
    "sochi": [24, 25, 26, 24, 23, 25, 27, 28, 26, 27],
    "kazan": [14, 12, 15, 17, 16, 13, 15, 18, 16, 17],
})

print(week)
Вывод
   day  sochi  kazan
0    1     24     14
1    2     25     12
2    3     26     15
3    4     24     17
4    5     23     16
5    6     25     13
6    7     27     15
7    8     28     18
8    9     26     16
9   10     27     17

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

lineplot: линия по порядку оси X

Температура в Сочи за 10 дней
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

week = pd.DataFrame({
    "day": list(range(1, 11)),
    "sochi": [24, 25, 26, 24, 23, 25, 27, 28, 26, 27],
    "kazan": [14, 12, 15, 17, 16, 13, 15, 18, 16, 17],
})

sns.set_theme()
ax = sns.lineplot(data=week, x="day", y="sochi", marker="o")
ax.set_title("Сочи: температура за 10 дней")
ax.set_xlabel("День")
ax.set_ylabel("Температура, C")
plt.show()
Вывод
График отображается под редактором

Точки соединились линией, кружки marker="o" отметили дни измерений, оси подписались именами столбцов. Динамика читается мгновенно: потепление с дня 5-го, пик 28 градусов на восьмой день. Пока это тот же график, что в уроке 1 — но именно на рядах проявляется важная особенность lineplot.

Несколько линий: два города

Сочи и Казань на одном графике
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

week = pd.DataFrame({
    "day": list(range(1, 11)),
    "sochi": [24, 25, 26, 24, 23, 25, 27, 28, 26, 27],
    "kazan": [14, 12, 15, 17, 16, 13, 15, 18, 16, 17],
})

sns.set_theme()
fig, ax = plt.subplots()
sns.lineplot(data=week, x="day", y="sochi", ax=ax, label="Сочи", marker="o")
sns.lineplot(data=week, x="day", y="kazan", ax=ax, label="Казань", marker="o")
ax.set_title("Сочи против Казани: 10 дней")
ax.set_xlabel("День")
ax.set_ylabel("Температура, C")
plt.show()
Вывод
График отображается под редактором

Здесь два новых приёма. Параметр ax= говорит Seaborn, на какие оси рисовать: сначала мы создали пару figure-axes через plt.subplots(), а потом отправили на неё обе линии — иначе каждый вызов получил бы отдельную картинку. Параметр label= даёт линии имя, и легенда собралась сама, без ручных вызовов. Обе линии делят одну ось Y, поэтому сравнение честное: Сочи стабильно на 8–12 градусов теплее, разрыв между городами виден на всём отрезке.

Полоса доверия: несколько наблюдений на точку

Реальный даталоггер пишет не раз в день, а трижды: утром, в полдень и вечером. На каждый день приходится несколько наблюдений — и lineplot делает то, чего не умеет plt.plot: усредняет их и показывает надёжность среднего.

Три измерения в день
import pandas as pd

meas = pd.DataFrame({
    "day": [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4],
    "temp": [18, 22, 20, 21, 25, 23, 19, 24, 21, 22, 27, 24],
})

print(meas)
Вывод
    day  temp
0     1    18
1     1    22
2     1    20
3     2    21
4     2    25
5     2    23
6     3    19
7     3    24
8     3    21
9     4    22
10    4    27
11    4    24
lineplot усредняет и рисует полосу
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

meas = pd.DataFrame({
    "day": [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4],
    "temp": [18, 22, 20, 21, 25, 23, 19, 24, 21, 22, 27, 24],
})

sns.set_theme()
ax = sns.lineplot(data=meas, x="day", y="temp", marker="o")
ax.set_title("Среднесуточная температура и её разброс")
ax.set_xlabel("День")
ax.set_ylabel("Температура, C")
plt.show()
Вывод
График отображается под редактором

Что произошло. По двенадцати строкам lineplot посчитал среднее для каждого дня — 20.0, 23.0, 21.3, 24.3 градуса — и провёл линию через четыре средних. Вокруг линии появилась полоса: 95-процентный доверительный интервал среднего. Полоса вокруг линии lineplot — это честная неуверенность среднего: чем сильнее прыгают наблюдения, тем она шире. День 3 с разбросом от 19 до 24 нарисовал заметно более широкую полосу, чем день 2, где измерения плотнее.

Что дальше

Вы собрали полный набор линейных приёмов: линия по времени, несколько рядов через ax= и label=, полоса доверия как мера надёжности. Осталось оформление: следующий урок — set_theme и контекст, пять тем Seaborn, крупный шрифт для презентаций и снятие лишнего декора.

lineplot усредняет повторные наблюдения сам: линия — среднее по точке, полоса — интервал, в котором среднее лежит с вероятностью 95%.

Что выведет код?

Сначала предскажи ответ в голове — это главный навык программиста.

import pandas as pd

week = pd.DataFrame({
    "day": [1, 2, 3],
    "temp": [18, 22, 20],
})
print(week["temp"].mean())
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

week = pd.DataFrame({
    "day": [1, 2, 3, 4],
    "sochi": [24, 25, 26, 24],
    "kazan": [14, 12, 15, 17],
})
fig, ax = plt.subplots()
sns.lineplot(data=week, x="day", y="sochi", ax=ax)
sns.lineplot(data=week, x="day", y="kazan", ax=ax)
print(len(ax.lines))
Проверь себя
0 / 5

1. Когда выбирают lineplot, а не scatterplot?

2. Чем lineplot отличается от plt.plot на неотсортированных по дате данных?

3. Как нарисовать две линии на одном графике?

4. Откуда берётся полоса вокруг линии lineplot?

5. Как оставить только линию без доверительной полосы?

Карточки терминов
Запомнено: 0 / 6
Практика

Постройте на одном графике две линии температуры за неделю: Москву и Казань (данные в заготовке). Обе линии — с маркерами "o" и подписями в легенде через label=.

practice.py
Вопросы и ответы по уроку

Как построить график lineplot по датам, а не по номерам дней?

Точно так же: положите даты в столбец и передайте его имя в x=. pandas парсит даты функцией pd.to_datetime, Seaborn расставит подписи оси сам. Важно только, чтобы столбец был датой или числом: строка «01.06.2026» без преобразования сортируется как текст.

Урок 7: темы и контекст

Что означает полоса вокруг линии в seaborn lineplot?

Это 95-процентный доверительный интервал среднего. Он появляется, когда на одно значение X приходится несколько наблюдений: lineplot сам усредняет их и показывает, насколько среднее надёжно. Широкая полоса — большой разброс или мало наблюдений, узкая — измерения согласованы.

Как убрать закрашенную полосу вокруг линии?

Параметром errorbar=None: sns.lineplot(data=df, x="day", y="temp", errorbar=None). Полезно и когда повторов на точку нет, и когда полоса отвлекает от сравнения нескольких линий. Старые примеры из интернета используют ci=False — в Seaborn 0.13+ этот параметр устарел.

Почему lineplot соединил точки не в том порядке, в котором они в таблице?

Потому что он сортирует точки по оси X (sort=True): линия всегда идёт слева направо по возрастанию X. plt.plot, напротив, соединяет строки как лежат. Если данные неотсортированы по времени, lineplot нарисует правильную линию, а plt.plot — зигзаг.

Понравился урок? Сошлитесь на него

«Полоса вокруг линии lineplot — это честная неуверенность среднего: чем сильнее прыгают наблюдения, тем она шире.»

Скопируйте готовую ссылку в формате HTML, Markdown или чистый адрес и вставьте в статью на Habr, VC, Telegram-канал или свой блог — так о проекте узнают новые читатели.

TelegramVK

Похожие уроки по темам

Подобраны автоматически по пересечению тем и ключевых слов.