Я пытаюсь построить диаграмму Санки, используя пакет networkd3 в r .
Я думаю, что правильно настроил набор данных, начиная со таблицы. Вот мой код:
M <- data.frame(as.matrix( table(as.character(df$q4.1),as.character(df$q4.2))))
M <- filter(M, Freq !=0)
q4.1 и q4.2 - это две категориальные переменные с одинаковыми категориями. Мне интересно визуализировать потоки, идущие от ответов в q4.1 до q4.2.
nodes <- data.frame(
name=c(as.character(M$Var1), as.character(M$Var2)) %>% unique()
)
Проблема в том, что, учитывая, что две переменные имеют одинаковые имена, когда я создать узлы, он включает в себя только один набор «имен».
Поэтому, если кто-то выбрал одну и ту же опцию в обоих вопросах, он в итоге получит один и тот же источник и цель (см. пример ниже)
M$IDsource <- match(M$Var1, nodes$name)-1
M$IDtarget <- match(M$Var2, nodes$name)-1
M
Var1 Var2 Freq IDsource IDtarget
No idea No idea 16 7 7
Как вы можете себе представить, результирующий график выглядит странно, поскольку люди, предоставляющие одинаковые ответы на оба вопроса, отображаются в виде круга, возвращающегося к одному и тому же источнику.
Переименовывает категории во втором вопросе единственная возможность решить проблему? Или что я делаю не так?
Спасибо за поддержку!
PS Я уже использовал пакет ggalluvial в ggplot2 для создания нужного мне графика. Однако он не так хорош (и может быть экспортирован как htmlwidget), как график, который вы можете получить с помощью пакета networkD3, поэтому я бы хотел воссоздать тот же график с networkD3. Вот успешный код, который я использовал с пакетом ggalluvial.
ggplot(data= M, aes(axis1= Var1, axis2= Var2, y= Freq)) + scale_x_discrete(limits = c("Next 6 months", "Next 12-18 Months"), expand=c(0.1, 0.05)) + geom_alluvium() + geom_stratum() + geom_text(stat="stratum", infer.label = TRUE)