R из сгруппированного фрейма данных на диаграмму Санки

Вчера я потратил большую часть времени на решение следующей проблемы и еще не нашел решения следующей проблемы:

У меня есть фрейм данных с категориальными данными: скажем, category1: имеет значения A и B; Другой столбец category2 имеет значения C, D, F, G; category3 имеет значения H и так далее ...

Я хочу сделать диаграмму Сэнки, показывающую, сколько (по ширине полос от узла к узлу) из категории 1 A находится в C, D, F, G. И это для всех других комбинаций в сгруппированном фрейме данных.

По сути, это дерево с шириной ветвей, показывающее, сколько счетчиков находится в конкретной ветке.

Есть ли способ сделать это гибким способом, чтобы он работал для большинства группировок в категориальных DF?


person DCB    schedule 19.10.2018    source источник


Ответы (2)


Вы можете попробовать с красивым пакетом ggalluvial:

library(ggalluvial)
library(ggplot2)

# some fake data
data <- data.frame(column1 = c('A','A','A','B','B','B')
                   ,column2 = c('C','D','E','C','D','E')
                   , column3 = c('F','G','H','I','J','K')
                               )

# add a costant as frequencies: if each "flow" count as 1, you can do this
data$freq <- 1

# here the plot
ggplot(data,
       aes(y = freq, axis1 = column1, axis2 = column2, axis3 = column3)) +
  geom_alluvium(aes(), width = 1/12) +
  geom_stratum(width = 1/12, fill = "black", color = "blue") +
  geom_label(stat = "stratum", label.strata = TRUE)  +
  scale_fill_brewer(type = "qual", palette = "Set1") +
  ggtitle("nice sankey")

введите здесь описание изображения

person s__    schedule 19.10.2018
comment
@DCB предоставляет ли он вам то, что вы искали? - person s__; 19.10.2018

Если вы хотите переставить данные в список узлов и список краев, вы можете воспользоваться библиотекой javascript D3 с пакетом networkD3. Вот пример с фиктивными данными (обратите внимание, что для использования этой библиотеки вам понадобится столбец id, который начинается с 0.

library(tidyverse)

nodes <- tibble(id = c(0:9), label = c(1:10))

edges <- tibble(from = c(5:15, 0:4, 16:19), to = (0:19), weight = rnorm(20))

library(networkD3)

sankeyNetwork(Links = edges, 
              Nodes = nodes, 
              Source = "from", 
              Target = "to", 
              NodeID = "label", 
              Value = "weight")
person Ben G    schedule 19.10.2018