</>
Topic 2 of 5

Course materials are currently available in Russian only.

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

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

Несколько линий

Каждый вызов plt.plot добавляет линию на тот же график:

import matplotlib.pyplot as plt

days = [1, 2, 3, 4, 5]
plt.plot(days, [3, 5, 4, 6, 8])
plt.plot(days, [2, 2, 5, 5, 7])

Если цвет не указан, matplotlib сам выбирает цвета по очереди: синий, оранжевый, зелёный, красный… Порядок линий на графике — это порядок вызовов plot.

Подписи и легенда

Чтобы было понятно, где какая линия, каждой дают подпись label, а потом вызывают plt.legend():

plt.plot(days, [3, 5, 4, 6, 8], label="Магазин А")
plt.plot(days, [2, 2, 5, 5, 7], label="Магазин Б")
plt.legend()

Легенда перечисляет линии в порядке их добавления. Положение можно указать: plt.legend(loc="upper left"); по умолчанию matplotlib сам ищет свободное место.

Линии в цикле

Если линий много, их рисуют в цикле — по одной на каждую строку данных:

data = {
    "Пн": [5, 6, 7],
    "Вт": [4, 6, 9],
    "Ср": [6, 6, 6],
}
for name, values in data.items():
    plt.plot([1, 2, 3], values, label=name)
plt.legend()

Разные стили для сравнения

Когда линий две-три, их удобно различать не только цветом, но и стилем — это помогает и при печати в чёрно-белом:

plt.plot(days, plan, color="gray", linestyle="--", label="План")
plt.plot(days, fact, color="tab:blue", marker="o", label="Факт")

Горизонтальные и вертикальные линии

Уровни — норму, порог, среднее — отмечают линиями через весь график:

plt.axhline(5, color="red", linestyle=":", label="Норма")   # горизонтальная на y = 5
plt.axvline(3, color="gray")                               # вертикальная на x = 3

Такие линии тоже попадают в легенду, если у них есть label.

Подписи точек

Иногда нужно подписать отдельные точки:

plt.plot(days, sales)
plt.annotate("рекорд", xy=(5, 8), xytext=(3.5, 8.5),
             arrowprops={"arrowstyle": "->"})
plt.text(1, 3, "старт")

text ставит надпись в точку, annotate — надпись со стрелкой к точке xy.

Итог

  • каждый plt.plot добавляет линию на тот же график, цвета чередуются автоматически;
  • label="..." у линии и plt.legend() — легенда в порядке добавления линий;
  • много линий удобно рисовать в цикле;
  • axhline(y), axvline(x) — горизонтальная и вертикальная линии через весь график;
  • text, annotate — подписи точек.