ggalluvial: Как мне построить аллювиальную диаграмму, когда у меня есть фрейм данных со ссылками и узлами? - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть этот кадр данных с точками времени (a, b и c) , метками (l1, l2, l3) и частотами, которые распределены по точкам времени и метками.Я хочу создать диаграмму Санки с пакетом ggalluvial в R. Вот некоторый код:

library(tidyverse)
library(forcats)
library(ggalluvial)
library(magrittr)

   plotAlluvial <- function(.df,name=freq) {
      y_name <- enquo(name)
      ggplot(.df,
         aes(
           x = tp,
           stratum = lbl,
           alluvium = id,
           label=lbl,
           fill = lbl,
           y=!!y_name
         )
       ) +
       geom_stratum() +
       geom_flow(stat = "flow", color = "darkgray") +
       geom_text(stat = "stratum")  +
       scale_fill_brewer(type = "qual", palette = "Set2") 
}

x1=c(6,0,0,5,5,4,2,0,3)
x2=c(5,5,3,0,0,5,0,7,0)
df=data_frame(tp1=rep(c('a','b'),each=9),
              lbl1=c(rep(c('l1','l2','l3'),2,each=3)),
              tp2=rep(c('b','c'),each=9),
              lbl2=c(rep(c('l1','l2','l3'),6)),
              freq=c(x1,x2)
)

df2=df %>% 
  mutate(id=row_number()) %>% 
  unite(un1,c(tp1,lbl1)) %>%
  unite(un2,c(tp2,lbl2)) %>%
  tidyr::gather(key,value,-c(freq,id)) %>%
  separate('value',c('tp','lbl')) 
df2.left= df2 %>% 
  dplyr::filter(!(key=='un1' & tp=='b'))
df2.right= df2 %>% 
  dplyr::filter(!(key=='un2' & tp=='b'))

Я могу построить левую сторону и построить правую сторону нужной мне диаграммы:

plotAlluvial(df2.left)
plotAlluvial(df2.right)

enter image description here enter image description here

Но если я пытаюсь построить левую и правую стороны одновременно, я получаю этот график:

plotAlluvial(df2)

enter image description here

Когда я использую код выше, график графика имеет слишком много частот в момент времени b.Уровень должен быть таким же высоким, как и у двух других слоев, поэтому он должен иметь высоту 25. Что я делаю не так?Как я могу создать диаграмму, которая объединит первые два графика?

РЕДАКТИРОВАТЬ:

После комментария я добавил пропорцию переменной частоты.Теперь слой b имеет правильную высоту, но входящий и исходящий потоки все еще занимают только 50% каждого условия в момент времени b.

df2 %<>% group_by(tp) %>% mutate(prop = freq / sum(freq)) %>%
ungroup() 
plotAlluvial(df2,prop)

enter image description here

...