Small multiples и фасетки

Десять маленьких графиков с общей шкалой читаются лучше одного с десятью линиями.

Small multiples (фасетки) — серия маленьких графиков с одинаковыми осями и масштабом, каждый для своей группы. Они позволяют сравнивать множество категорий, не сваливая всё в один перегруженный график.

Проблема «спагетти»

Когда на одном графике 12 линий разных серий, они переплетаются в нечитаемый клубок («spaghetti plot»). Цветов не хватает, линии пересекаются, легенду не сопоставить. Тафти предложил решение: разбить на маленькие повторяющиеся панели — по одной на серию, — выстроенные в сетку с общими осями. Глаз быстро сканирует сетку, сравнивая форму каждой панели с соседними.

Ключ — общая шкала

Главное правило фасеток: все панели делят один и тот же диапазон осей. Тогда сравнение честно: панель, где линия выше, действительно про большие значения. Если у каждой панели своя автошкала, сравнение ломается — маленькая группа «раздувается» до размера большой. Поэтому при фасетировании всегда фиксируйте общие пределы осей (в библиотеках это sharex=True, sharey=True).

Spaghetti (плохо):        Small multiples (хорошо):
  все 6 серий в куче        A      B      C
   /\/\  /\                 /\     _/     /\_
  /\/\\//\\/               /  \   /      _/  \
  нечитаемо                D      E      F
                          \_     /\     __/
                          общая шкала у всех

Маленький помощник: единая шкала

Чтобы выставить общие пределы осей по всем группам, нужно взять глобальные минимум и максимум. Посчитаем их для нескольких серий.

series = {
    "A": [2, 5, 3, 8, 6],
    "B": [1, 1, 2, 3, 2],
    "C": [10, 12, 9, 11, 14],
}
all_vals = [v for s in series.values() for v in s]
g_min, g_max = min(all_vals), max(all_vals)
pad = (g_max - g_min) * 0.05
print("общие пределы Y для всех фасеток:")
print("  ymin =", round(g_min - pad, 2), " ymax =", round(g_max + pad, 2))
for name, s in series.items():
    print(f"  {name}: диапазон {min(s)}..{max(s)} (рисуем в общей шкале)")

Вывод:

общие пределы Y для всех фасеток:
  ymin = 0.35  ymax = 14.65
  A: диапазон 2..8 (рисуем в общей шкале)
  B: диапазон 1..3 (рисуем в общей шкале)
  C: диапазон 9..14 (рисуем в общей шкале)

Все три панели нарисуются в диапазоне 0,35..14,65 — и сразу видно, что серия C систематически выше, а B — низкая. На отдельных автошкалах эту разницу бы потеряли.

Порядок панелей — тоже данные

Сетку фасеток не обязательно упорядочивать алфавитом. Часто полезнее отсортировать по содержательному признаку — по среднему, по тренду, по году. Тогда сама раскладка несёт информацию: глаз видит градиент по сетке. Это приём «упорядоченных small multiples».

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

Фасетки эксплуатируют сильную сторону зрения — быстрое параллельное сравнение похожих форм (гештальт-сходство). Мозг легко замечает, какая панель «выбивается», если все остальные одинаковы по структуре и масштабу. По сути это перенос сравнения с ненадёжного канала «цвет» (различать 12 линий по цвету) на надёжный «позиция в общей сетке + форма».

Почему фасетки бьют цвет

Когда серий становится много, естественный соблазн — добавить ещё цветов. Но мы уже знаем: предвнимательно различимы лишь 6-8 цветов, дальше глаз путается, а легенда из пятнадцати оттенков нечитаема. Small multiples снимают эту проблему радикально: вместо того чтобы перегружать один график, мы переносим различие категорий на позицию в сетке. Каждая панель занимает своё место, и сравнение идёт не «какой это был цвет?», а «какая панель выше соседних?» — операция, которую зрение выполняет мгновенно и точно.

Тафти назвал small multiples одним из самых сильных приёмов визуализации именно за этот эффект: они масштабируются туда, где обычный график ломается. Двадцать стран на одной линейной диаграмме — каша; двадцать маленьких панелей с общей шкалой — обозримая таблица трендов, по которой глаз скользит, замечая выбивающиеся. Цена — место на листе, но в эпоху больших экранов и векторных PDF это редко проблема. Принцип «лучше много маленьких честных графиков, чем один перегруженный» стоит держать в голове всегда.

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

  • Независимые шкалы у панелей — сравнение становится ложным.
  • Слишком мелкие панели — теряются детали; лучше меньше панелей, но читаемых.
  • Случайный порядок панелей — упустили возможность закодировать признак раскладкой.
  • Дублировать подписи осей на каждой панели — chartjunk; подписывайте по краю сетки.

Итог

  • Small multiples заменяют «спагетти» сеткой маленьких панелей.
  • Обязательна общая шкала осей для честного сравнения.
  • Порядок панелей можно сделать носителем информации.
  • Это перенос сравнения с цвета на позицию и форму.
Проверьте себя
1. Какую проблему решают small multiples?
AНехватку цвета в файле
BНечитаемость графика с множеством переплетённых серий («спагетти»)
CМедленный рендеринг
DОтсутствие легенды
2. Почему у всех фасеток должна быть общая шкала осей?
AТак красивее
BИначе сравнение ложно: маленькая группа на своей автошкале раздувается до размера большой
CЧтобы сэкономить место
DЭто требование формата
3. Как ещё можно использовать порядок панелей в сетке?
AНикак, порядок не важен
BОтсортировать панели по содержательному признаку (среднему, тренду), чтобы раскладка несла информацию
CРасставить случайно
DВсегда по алфавиту