R из сгруппированного кадра данных в диаграмму Санки - PullRequest
0 голосов
/ 19 октября 2018

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

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

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

Это в основном дерево с шириной ветвей, показывающее, сколько счетчиков в конкретной ветке.

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

Ответы [ 2 ]

0 голосов
/ 19 октября 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")
0 голосов
/ 19 октября 2018

Вы можете попробовать с хорошим 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")

enter image description here

...