Взвешенная санкей / аллювиальная диаграмма для визуализации дискретных и непрерывных данных панели?
Вопросы
Я пытаюсь визуализировать групповые данные о людях, которые включают как дискретный, так и категоричный выбор, и непрерывный выбор в каждый период времени. Одним из распространенных примеров такой ситуации являются клиенты, покупающие продукт / подписку и затем выбирающие, как часто использовать продукт / услугу.
Я хотел бы показать "потоки" через периоды времени, взвешенные непрерывной переменной в каждом периоде времени - своего рода нечто среднее между взвешенной гистограммой с накоплением и диаграммой Санки или аллювиальным. Диаграммы Санки и аллювиальные диаграммы в основном представляют потоки между узлами, где каждый поток имеет одну величину. Вместо этого я хотел бы показать "потоки", представляющие непрерывный выбор, который может иметь разные значения в разные периоды времени, даже для одного и того же человека. Результирующая диаграмма будет очень похожа на график Санки или аллювиального за исключением того, что аллювия или "потоки" будут постепенно менять ширину между периодами времени. Например, предположим, что покупатель покупает одну и ту же подписку за два периода времени, но использует ее чаще во втором периоде; такое использование может быть представлено полосой или "потоком", ширина которого увеличивается от первого до второго периода времени.
- Этот тип диаграммы уже существует где-нибудь? Я не смог найти каких-либо примеров в довольно обширном поиске. Если он не существует, я надеюсь, что значение такого типа диаграммы ясно и что кто-то назовет и создаст его!:)
- Как такой граф может быть "взломан" в R с использованием существующих аллювиальных или sankey библиотек? Я предполагаю, что это не тривиально, так как эти типы диаграмм определяются постоянными потоками между узлами.
Пример в R
Я рассмотрю пример с использованием R, чтобы прояснить проблему. Вот пример набора данных:
library(tidyr)
library(dplyr)
library(alluvial)
library(ggplot2)
library(forcats)
set.seed(42)
individual <- rep(LETTERS[1:10],each=2)
timeperiod <- paste0("time_",rep(1:2,10))
discretechoice <- factor(paste0("choice_",sample(letters[1:3],20, replace=T)))
continuouschoice <- ceiling(runif(20, 0, 100))
d <- data.frame(individual, timeperiod, discretechoice, continuouschoice)
Я могу наглядно визуализировать данные панели для дискретного или категорического выбора. Сложенная гистограмма может использоваться, чтобы показать, как количество людей в каждой категории изменяется с течением времени. Аллювиальные диаграммы или диаграммы Санки могут дополнительно показывать отдельные движения, которые вызывают изменения в итоговых категориях. Например:
# stacked bar diagram of discrete choice by individual
g <- ggplot(data=d,aes(timeperiod,fill=fct_rev(discretechoice)))
g + geom_bar(position="stack") + guides(fill=guide_legend(title=NULL))
# alluvial diagram of discrete choice by individual
d_alluvial <- d %>%
select(individual,timeperiod,discretechoice) %>%
spread(timeperiod,discretechoice) %>%
group_by(time_1,time_2) %>%
summarize(count=n()) %>%
ungroup()
alluvial(select(d_alluvial,-count),freq=d_alluvial$count)
Я также могу посмотреть на итоги непрерывного выбора по категориям и по периодам времени, взвесив гистограмму с накоплением.
# stacked bar diagram of discrete choice, weighting by continuous choice
g + geom_bar(position="stack",aes(weight=continuouschoice))
Однако я не могу добавить какие-либо отдельные "потоки" в разные периоды времени к этой взвешенной гистограмме с накоплением. Эти "потоки" будут иметь разную ширину в период времени 1, чем в период времени 2, поэтому они должны быть показаны как постепенно изменяющиеся ширины между периодами времени. Напротив, диаграммы Санки и аллювиальные диаграммы имеют одну величину или ширину для каждого потока.
1 ответ
Я столкнулся с такой путаницей в начале адаптации аллювиального пакета к фреймворку ggplot2. Для диаграмм Санки и аллювиальных диаграмм нередко меняется вес с позиции на позицию, но аллювиальные не были созданы для обработки данных в формате, подходящем для их кодирования. (Изменить: alluvial_ts()
функция в аллювиальных была- см. пример в README- но она не производит гистограммы с накоплением в каждый период времени.)
Одним из вариантов может быть использование параллельных наборов geoms в разрабатываемой версии ggforce, хотя я сам не знаком с ними. Другой, о котором я знаю, мой собственный, ggalluvial. Вот одно решение вашей проблемы, я думаю, используя ваш набор данных d
(обратите внимание, что цвета отличаются):
library(ggalluvial)
ggplot(
data = d,
aes(
x = timeperiod,
stratum = discretechoice,
alluvium = individual,
y = continuouschoice
)
) +
geom_stratum(aes(fill = discretechoice)) +
geom_flow()
Также возможно окрашивать потоки между периодами времени; смотрите примеры.
Я не смог найти хорошее обсуждение различий в форматах данных, то есть в том, что каждая строка соответствует одному предмету за все периоды времени и одному предмету за один период времени, поэтому я попытался написать один в виньетке. Если есть предложения, буду рад их услышать!