Внимание: визуализация Joy Plots — не лучший вариант использования в визуализациях бизнеса и для аналитики , но вы можете использовать их в нетривиальных визуализациях. Создавая такие визуализации можно расширить свои знания и владение Tableau.

В этой статье рассматривается такой вид визуализации геоданных, при котором значения кодируются при помощи набора линий. По сути, это ряд графиков друг над другом с некоторым нагом по широте, отражающих изменение какой то метрики по оси долготы. Одним из примеров может служить визуализация фактов выселения за нарушение условий правил пользования жильем в Сан-Франциско:

1. Немного истории

Название визуализации Joy Plot cвязывают с обложкой альбома ‘Unknown Pleaures’ британской группы ‘Joy Division’, который вышел в 1979г. На обложке изображен спектр волн излучения без контекста, и обычному человеку кажется, что это какой-то мистический ландшафт. Вот, собственно, эта визуализация, ставшая впоследствии одной из самых узнаваемых.

Также можно встретить понятие Population Lines под которым понимаются линии на карте, отражающие населенность в определенных точках. Несколько лет назад James Cheshire опубликовал статью, в которой описал работу над таким типом визуализации. Также есть примеры на Reddit.

Konstantin Greger создал в Tableau Population Lines для Европы и описал процесс создания в блоге.

Я сделал подобную визуализацию в Tableau полтора года назад:

Population Lines — это набор графиков, расположенных друг под другом с некоторым шагом по широте. Каждый график показывает численность населения на одной широте, и на всем протяжении графика долгота меняется. Таким образом создается иллюзия одной визуализации или карты.

Такого же типа визуализации, отражающие высоту рельефа в точках можно построить при помощи QGIS, они называются Dynamic elevation profile lines.

В действительности можно любые геоданные отобразить подобным образом, например, на визуализации «Evictions in San Francisco» такие линии отображают динамику выселений в Сан-Франциско

Далее рассмотрим как можно создавать такие визуализации, если есть информация о каких-либо событиях и их геопозиция (широта и долгота).

2. Округление геокоординат

Для примера возьмем данные об инцидентах возгораний в Лондоне с сайта london.gov.uk. Данные содержат сведения о каждом инциденте: времени и дате инцидента, типе инцидента, его координаты — широту и долготу (для некоторых инцидентов данные геопозиции отсутствуют), а также дополнительные данные, которые мы не будем анализировать.

Если в Tableau построить карту с местами инцидентов, то получим следующее:

Сделаем 2 вычисляемых поля LatRound и LongRound:

ROUND([Latitude],2)

ROUND([Longitude],2)

В этих полях координаты округляются до второго знака, и карта будет выглядеть так:

То есть, мы разбили область карту на сетку с шагом 0.01 по широте и долготе. Если же посчитать количество инцидентов в каждой точке, то есть, добавить поле Number of Records в размер меток, получится следующая картина:

Здесь можно видеть места скопления инцидентов возгорания.

Следует заметить, что трюк с округлением геокоординат применяется достаточно часто в визуализациях Tableau. Одним из примеров может служить Armed Conflicts in Africa by Mark Bradbourne. Другой пример — ACLED Visualizing Conflict by Mike Cisneros.

Можно делать более сложные вычисления для расчета шагов сетки, когда результат обычного округления не устраивает. Для нашего датасета шаг с округлением до 2-го знака слишком большой, а с округлением до 3-го знака — слишком мелкий. Поэтому я выбрал шаги, чтобы получилась такая картина:

Вычисления этих шагов описываются следующими LatRound и LongRound:

ROUND((-51 + [Latitude])*2,2)

ROUND((1+[Longitude])*4,2)

Здесь шаг по широте в 2 раза больше шага по долготе, но сами вычисления не являются широтой и долготой на карте, поскольку подложку из карт использовать пока не будем. По сути, на рисунке изображена диаграмма разброса в первом квадранте координатной плоскости.

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

Для этого надо определить минимальные и максимальные X и Y координаты и сгенерировать набор данных Lattitude, Longitude с шагом, соответствующим шагу в источнике с данными.

3. Делаем сетку геокоординат

Для этого в MS Excel можно построить таблицу, где в столбце A перебираются все значения долготы, а в следующих столбцах значения широты с шагом 0.01 в нашем случае.

После этого нужно сделать операцию Pivot в Tableau Prep, чтобы данные приняли следующий вид:

Получили 2 столбца со значениями широты и долготы.

Операцию Pivot также можно сделать внутри Tableau Desktop, либо создать готовый набор данных при помощи Python.

Далее делаем джойн датасета с данными и датасета с сеткой координат (Output.csv). На скриншоте снизу джойн правый, то есть, оставляем все координаты сетки. В качестве пунктов объединения используем округленные значения широты и долготы.

Если теперь посмотреть на картину, которую мы получили, то есть точки с данными (оранжевый цвет) и точки без данных (синий цвет).

4. Убираем лишние точки

Следующий шаг — оставить в визуализации все синие точки внутри оранжевой области, а снаружи — убрать из данных, поскольку они не нужны в визуализации. В этом нам помогут вычисления LOD, сделаем вычисление Null Dot Filter:

[Long]< { FIXED [Lat]: MIN({ FIXED [Lat], [Long]: MIN(IIF(ISNULL([Incident Number])=false,[Long], NULL))})} -0.02
OR
[Long]> { FIXED [Lat]: MAX({ FIXED [Lat], [Long]: MIN(IIF(ISNULL([Incident Number])=false,[Long], NULL))})} +0.02

Вычисление делит точки на 2 группы, где группу Fasle мы оставляем, а группу True убираем из данных при помощи фильтра экстракта. Группа True сильно добавляет количество точек и снижает производительность, но никакого смысла не несет.

Важно: числа +0.02 и -0.02 в вычисления нужны, чтобы для каждой строки захватить крайнюю левую и крайнюю правую точку с нулевым значением. Это нужно для того, чтобы каждая линия начиналась с точки без данных и заканчивалаcь точкой без данных.

Теперь у нас остались только «полезные» точки, с которыми дальше будем работать.

Создадим вычисление Y

MIN([Lat])+ COUNTD([Incident Number])/[Height]

Это вычисление будет поднимать по оси Y точки, согласно количеству инцидентов на сетке. Поместив это вычисление в Rows, получим такую визуализацию:

Немного поработав с цветами и высотой пиков, получим:

Цвета линий можно задать любым математическим выражением. В моем случае это выражение:

COUNTD([Incident Number])^0.4

Переключив тип меток на полигоны, получим такую картинку:

Таким образом, у нас получился Joy Plot на основе геоданных.

Дополнительно можем еще убрать точки, где нет инцидентов, а слева и справа от них также нет инцидентов. Это производится при помощи LOOKUP. Создадим вычисление Lookup Filter (направление вычислений — table across):

LOOKUP(COUNTD([Incident Number]),-1)=0
AND
LOOKUP(COUNTD([Incident Number]),0)=0
AND
LOOKUP(COUNTD([Incident Number]),1)=0

Это вычисление делит точки на 3 группы:

Null (синие) — крайние нулевые значения для каждой линии. Их оставляем

False (оранжевые) — значения, которые мы хотим видеть на визуализации, их тоже оставляем

True (красные) — точки, которые можем отбросить.

Для данной визуализации общее количество меток уменьшилось с 16000 до 15180 после отброса.

Таким приемом можно пользоваться, если создаете неанимированную визуализацию без фильтров.

5. Отображение графиков на карте

Теперь давайте приведем координаты на координатной плоскости к координатам на карте. Для этого сделаем обратные преобразования в вычислениях Lat Geo и Long Geo:

MIN(51 + [Lat]/2) + COUNTD([Incident Number])/[Height]

-1+[Long]/4

Это преобразования обратные вычислениям LatRound и LongRound, при помощи которых мы создавали кастомную сетку геокоординат.
Построим графики на карте:

Здесь для того , чтобы подчеркнуть пики на карте, в размер было добавлено вычисление:

COUNTD([Incident Number])^0.2

Степень 0.2 введена для нелинейности окраски линий. Подбирая этот коэффициент, можно делать пики более выразительными.

Карта готова, теперь можно добавить параметры для выбора года и типа инцидента, поработать над внешним видом дашборда, и получим:

Клик для перехода на визуализацию

Можно включить анимацию, и тогда при переключении параметров выбора года и типа инцидента, увидим анимированный Joy Plot.

Заключение

Такого типа визуализации не подходят для дашбордов бизнеса, но они встречаются в работах дата-журналистов и геовизуализациях.
При описании создания визуализации, в этой статье разбирались вложенные LODы и фильтры на базе табличных вычислений, позволяющие отфильтровывать ненужные точки. Можно попрактиковаться на таких визуализациях для того, чтобы понять как вложенные LODы и табличные функции работают с графиками