Scatter и overplotting: когда точки сливаются
На больших данных scatter превращается в чёрное пятно — и приёмы спасения от этого.
Overplotting — наложение точек диаграммы рассеяния друг на друга, из-за чего плотные области сливаются в сплошное пятно и теряется информация о концентрации.
Scatter — король зависимостей
Диаграмма рассеяния кодирует две числовые переменные позицией по X и Y — двумя самыми точными каналами. Поэтому для вопроса «как связаны A и B?» scatter почти всегда лучший выбор: видны тренд, разброс, кластеры, выбросы, нелинейность. Но у него есть враг — overplotting.
Проблема наложения
Когда точек тысячи, в плотных областях они садятся друг на друга. Глаз видит сплошную чёрную кляксу и не может оценить, где концентрация выше: 100 точек в пикселе выглядят так же, как 5. Информация о плотности теряется именно там, где она важнее всего. Есть четыре основных приёма борьбы.
| Приём | Идея | Когда |
| Прозрачность (alpha) | точки полупрозрачны, плотность = темнота | до ~10k точек |
| Джиттер | лёгкий случайный сдвиг разлепляет совпадения | дискретные/округлённые значения |
| Hexbin | плоскость в шестиугольники, цвет = счётчик | десятки тысяч+ точек |
| Контуры плотности | 2D-KDE, линии уровня | гладкие распределения |
Прозрачность: считаем эффект
Идея alpha: если в одном месте наложилось $k$ точек с прозрачностью $\alpha$, итоговая непрозрачность равна $1 - (1-\alpha)^k$ — она растёт с числом точек, так что плотные зоны темнее. Посчитаем.
alpha = 0.1
for k in [1, 2, 5, 10, 30]:
opacity = 1 - (1 - alpha) ** k
bar = '#' * int(opacity * 30)
print(f"{k:2d} точек -> непрозрачность {opacity:.2f} {bar}")Вывод:
1 точек -> непрозрачность 0.10 ## 2 точек -> непрозрачность 0.19 ##### 5 точек -> непрозрачность 0.41 ############ 10 точек -> непрозрачность 0.65 ################### 30 точек -> непрозрачность 0.96 ############################
Одна точка едва видна, а скопление из 30 почти чёрное — так глаз считывает плотность. Подбор alpha — это подгонка под типичную кратность наложения.
Hexbin: биннинг плоскости
Когда точек слишком много даже для alpha, плоскость разбивают на шестиугольные ячейки и красят каждую по числу попавших точек — это 2D-гистограмма. Шестиугольники предпочтительнее квадратов: у них меньше искажений на границах и нет «решётчатого» артефакта. Hexbin превращает миллион точек в читаемое поле плотности.
scatter (overplot) hexbin (плотность цветом)
все точки чёрным . : o # # o :
███████ : # @ @ # : .
██████ <- клякса o # @ @ # o
███████ : # @ # : .
легенда: . низк @ высЛиния тренда
К scatter часто добавляют линию тренда — она помогает увидеть зависимость сквозь шум. Но осторожно: линейный тренд предполагает линейную связь (вспомните набор II квартета Энскомба!). Всегда проверяйте, что тренд осмыслен, и не экстраполируйте его за пределы данных.
Как работает под капотом
Overplotting — это потеря информации из-за конечного разрешения экрана и непрозрачности маркеров: пиксель может быть либо «закрашен», либо нет, а сколько точек его закрасило — теряется. Alpha решает это, делая закраску аддитивной (приближённо), hexbin — явным подсчётом. По сути все приёмы восстанавливают третье измерение — плотность — которое scatter по умолчанию выбрасывает.
Третье измерение, которое теряет scatter
Полезно осознать, что у плотного scatter есть скрытое третье измерение — локальная плотность точек, — и все приёмы борьбы с overplotting по сути восстанавливают именно его. Прозрачность кодирует плотность яркостью, hexbin — явным цветом ячейки, контуры 2D-KDE — линиями уровня. Выбор между ними — вопрос масштаба: до тысяч точек хватает alpha, на десятках тысяч лучше hexbin, для гладких распределений выразительнее контуры. Нередко их совмещают: полупрозрачные точки плюс несколько контуров плотности сверху дают и отдельные наблюдения, и общую картину концентрации.
Отдельная разновидность проблемы — дискретные или округлённые данные. Если величины принимают мало различных значений (оценки по 5-балльной шкале, годы, целые счётчики), точки садятся ровно друг на друга, и даже alpha не спасает — в одной координате могут быть сотни наблюдений. Здесь помогает джиттер: крошечный случайный сдвиг разлепляет совпадения, не искажая смысла. Главное — делать сдвиг достаточно малым, чтобы он не выглядел как реальный разброс, и упоминать о нём в подписи.
Частые ошибки
- Непрозрачные точки на больших данных — чёрная клякса без информации о плотности.
- Слишком крупные маркеры — усиливают наложение; на плотных данных делайте точки мелкими.
- Игнорировать дискретность — округлённые значения садятся в одни точки; нужен джиттер.
- Линейный тренд на нелинейных данных — вводит в заблуждение, как в квартете Энскомба.
Итог
- Scatter — лучший выбор для зависимости двух величин.
- Overplotting прячет плотность; борются alpha, джиттером, hexbin, контурами.
- Прозрачность делает плотные зоны темнее по закону $1-(1-\alpha)^k$.
- Линию тренда добавляйте осознанно и не экстраполируйте.