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

Сначала вопрос — потом график. Тип диаграммы вытекает из того, что вы хотите показать.

«Не выбирайте график потому, что он знаком. Начните с истории, которую хотите рассказать, и пусть она диктует форму».

У новичков типичный путь: «мне нужен график → возьму красивый». У профессионалов наоборот: «у меня есть вопрос → какой график на него отвечает». Существует пять базовых задач визуализации, и для каждой есть свой инструмент.

Почему это важно на практике? Потому что неправильный тип графика не просто «выглядит хуже» — он отвечает не на тот вопрос. Представьте, что руководитель спрашивает: «какой регион лучший по продажам?». Это вопрос сравнения, и честный ответ — отсортированный bar, где взгляд за долю секунды находит самый длинный столбик. Если вместо этого показать line, соединив регионы линией, вы навяжете ложную идею тренда: будто «Север перетекает в Юг». А если показать pie из двенадцати секторов, зритель будет мучительно сравнивать почти одинаковые углы. Один и тот же набор данных, поданный тремя способами, рождает три разных вывода — и только один из них верный. В аналитике стоимость такой ошибки измеряется неверными управленческими решениями, а не эстетикой.

Удобно держать в голове, что выбор графика — это связка трёх вещей: вопроса (что хочу показать), типа переменных (категориальная, числовая, временная) и числа наблюдений. Категориальная против числовой почти всегда даёт bar. Две числовые — scatter. Время против числовой — line. А число наблюдений подсказывает детали: пять категорий укладываются в вертикальный bar, тридцать — лучше в горизонтальный barh, а пятьсот точек динамики просят line вместо набора столбиков. Сначала классифицируйте переменные — и половина решения уже принята автоматически.

Существуют и «гибридные» вопросы, у которых нет одного очевидного ответа. «Как менялось распределение зарплат по годам?» — это распределение плюс динамика; здесь подойдёт серия boxplot по годам или ridgeline-график. «Связаны ли две метрики и как это зависит от сегмента?» — scatter с цветовым кодированием категории. Не пугайтесь таких случаев: разложите вопрос на базовые задачи из списка ниже, и нужный график соберётся из их комбинации. Главное — не хвататься за знакомую форму до того, как сформулирован вопрос.

Пять задач визуализации

  • Сравнение категорий — столбчатая диаграмма (bar).
  • Динамика во времени — линейный график (line).
  • Распределение одной переменной — гистограмма, boxplot, violin.
  • Связь двух переменных — диаграмма рассеяния (scatter).
  • Состав целого — stacked bar, реже pie.

Это дерево решений. Двигайтесь сверху вниз: от вопроса к структуре данных, от данных — к графику.

                  Что вы хотите показать?
                            |
      +---------+----------+-----------+-----------+
      |         |          |           |           |
  Сравнение  Динамика  Распределение  Связь    Состав
      |         |          |           |           |
   bar/      line/      hist/        scatter/   stacked
   barh      area       box/violin   bubble     bar/pie
      |         |          |           |           |
  категории  время     одна          две        части
  vs число   vs число  числовая      числовые   целого

Как работает под капотом

Каждый тип графика — это отображение колонок данных на визуальные каналы (оси, цвет, размер). Bar: категория -> ось X, число -> высота. Scatter: число -> X, число -> Y. Понимая это отображение, вы поймёте, почему нельзя строить line по категориям без естественного порядка: линия подразумевает непрерывность.

Прежде чем строить распределение, полезно вручную разложить данные по «корзинам» — это и есть основа гистограммы.

# Раскладываем данные по бинам (корзинам) — основа гистограммы
data = [3, 7, 7, 2, 9, 4, 6, 7, 1, 8, 5, 6, 3, 7, 10, 2, 6, 8]

bin_width = 2
bins = {}
for x in data:
    key = (x // bin_width) * bin_width  # левая граница бина
    bins[key] = bins.get(key, 0) + 1

for left in sorted(bins):
    bar = "#" * bins[left]
    print("[{:>2}-{:>2}) {:>2} {}".format(left, left + bin_width, bins[left], bar))

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

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

Линейный график по категориям без порядка (страны, отделы) — линия ложно намекает на тренд. Pie chart с десятком секторов — глаз не различает близкие углы. Scatter там, где нужна динамика — теряется ось времени. Выбор графика «на глаз» вместо «от вопроса».

Есть и более тонкие промахи. Двойная ось Y (две разные шкалы на одном графике) почти всегда вводит в заблуждение: подгоняя масштабы, можно «доказать» любую корреляцию между несвязанными рядами. Гистограмма для категориальной переменной — ошибка типа данных: гистограмма нужна для непрерывных чисел, а не для названий городов (там нужен bar частот). Stacked bar с пятью и более сегментами — сравнить можно только нижний сегмент, потому что у остальных «плавает» базовая линия. И наконец, попытка втиснуть в один график ответы сразу на три вопроса: перегруженная диаграмма не отвечает чётко ни на один — лучше сделать три простых графика.

Best practices

  • Сформулируйте вопрос одним предложением, прежде чем кодить.
  • Line — только для упорядоченной оси (время, последовательность).
  • Для состава предпочитайте stacked bar пирогу: углы сравнивать труднее, чем длины.

Итог: дерево «вопрос → данные → график» — ваш главный навигатор. Теперь, зная карту, перейдём к инструменту, который умеет рисовать любую её ветку — Matplotlib.

Проверьте себя
1. Какой график лучше всего показывает динамику метрики во времени?
APie chart
BЛинейный график (line)
CДиаграмма рассеяния
DГистограмма
2. Почему нельзя строить линейный график по категориям без порядка (например, по странам)?
ALine слишком медленный
BЛиния ложно подразумевает непрерывность и тренд между категориями
CКатегории нельзя нанести на ось
DЦвет линии будет неверным