使用第一个轴作为填充制作 alluvial/sankey 图

Making an alluvial/sankey diagram using the first axis as the fill

我有这个数据:

https://docs.google.com/spreadsheets/d/18sTSOzVEmSEI2KGfGSvRT_0BbzQ9n87kCGZH-cSULCs/edit?usp=sharing(放在生成它的代码下方)

我使用这个代码:

library(ggplot2)
library(ggalluvial)
ggplot(data = modechoice,
       aes(y = Freq, axis1 = s2_vervoermiddel_werkstudie_voor, axis2 = s2_vervoermiddel_werkstudie_na)) +
  geom_alluvium(aes(fill = "black"), width = 1/12) +
  geom_stratum(width = 1/12, fill = "black", color = "grey") +
  geom_label(stat = "stratum", aes(label = after_stat(stratum))) +
  scale_x_discrete(limits = c("Before", "After"), expand = c(.05, .05)) +
  scale_fill_brewer(type = "qual", palette = "Set1") +
  ggtitle("Mode choice before corona and expected after")

我得到了这个结果:

并非如您所愿。

首先,我希望填充由 axis1 着色。所以 s2_vervoermiddel_werkstudie_voor 应该指定颜色,但是当我尝试这样做时出现错误(而不是“黑色”,我输入 s2_vervoermiddel_werkstudie_voor)

(Error: Continuous value supplied to discrete scale)

其次,如何更改标签,使它们看起来不像我们落后十年?

三、如何更改顺序?

structure(list(s2_vervoermiddel_werkstudie_voor = c("Auto (bestuurder)", 
"Auto (bestuurder)", "Auto (bestuurder)", "Auto (bestuurder)", 
"Auto (bestuurder)", "Auto (bestuurder)", "Auto (bestuurder)", 
"Auto (bestuurder)", "Auto (bestuurder)", "Auto (bestuurder)", 
"Auto (passagier)", "Auto (passagier)", "Auto (passagier)", "Auto (passagier)", 
"Auto (passagier)", "Auto (passagier)", "Auto (passagier)", "Auto (passagier)", 
"Trein", "Trein", "Trein", "Trein", "Trein", "Trein", "Trein", 
"Trein", "Trein", "Trein", "Bus/Tran/Metro", "Bus/Tran/Metro", 
"Bus/Tran/Metro", "Bus/Tran/Metro", "Bus/Tran/Metro", "Bus/Tran/Metro", 
"Bus/Tran/Metro", "Bus/Tran/Metro", "Fiets", "Fiets", "Fiets", 
"Fiets", "Fiets", "Fiets", "Fiets", "Fiets", "Fiets", "Fiets", 
"E-bike/speed pedelec", "E-bike/speed pedelec", "E-bike/speed pedelec", 
"E-bike/speed pedelec", "Scooter/brommer/motor", "Scooter/brommer/motor", 
"Scooter/brommer/motor", "Scooter/brommer/motor", "Scooter/brommer/motor", 
"Lopen", "Lopen", "Lopen", "Lopen", "Lopen", "Lopen", "Lopen", 
"NVA", "NVA", "NVA", "NVA", "NVA", NA, NA, NA, NA, NA, NA, NA, 
NA), s2_vervoermiddel_werkstudie_na = c("Auto (bestuurder)", 
"Auto (passagier)", "Trein", "Bus/Tran/Metro", "Fiets", "E-bike/speed pedelec", 
"Scooter/brommer/motor", "Lopen", "NVA", NA, "Auto (bestuurder)", 
"Auto (passagier)", "Trein", "Bus/Tran/Metro", "Fiets", "Lopen", 
"NVA", NA, "Auto (bestuurder)", "Auto (passagier)", "Trein", 
"Bus/Tran/Metro", "Fiets", "E-bike/speed pedelec", "Scooter/brommer/motor", 
"Lopen", "NVA", NA, "Auto (bestuurder)", "Auto (passagier)", 
"Trein", "Bus/Tran/Metro", "Fiets", "E-bike/speed pedelec", "NVA", 
NA, "Auto (bestuurder)", "Auto (passagier)", "Trein", "Bus/Tran/Metro", 
"Fiets", "E-bike/speed pedelec", "Scooter/brommer/motor", "Lopen", 
"NVA", NA, "Auto (bestuurder)", "Fiets", "E-bike/speed pedelec", 
NA, "Auto (bestuurder)", "Fiets", "E-bike/speed pedelec", "Scooter/brommer/motor", 
NA, "Auto (bestuurder)", "Trein", "Bus/Tran/Metro", "Fiets", 
"Lopen", "NVA", NA, "Auto (bestuurder)", "Auto (passagier)", 
"Fiets", "NVA", NA, "Auto (bestuurder)", "Trein", "Bus/Tran/Metro", 
"Fiets", "E-bike/speed pedelec", "Lopen", "NVA", NA), Freq = c(441, 
2, 11, 1, 21, 12, 3, 3, 3, 46, 4, 9, 1, 1, 2, 1, 1, 1, 25, 3, 
156, 1, 22, 4, 2, 2, 6, 18, 10, 1, 7, 49, 17, 3, 2, 10, 30, 1, 
28, 10, 348, 11, 4, 4, 6, 39, 2, 2, 53, 11, 4, 1, 1, 13, 2, 2, 
5, 2, 8, 26, 1, 4, 1, 1, 1, 22, 1, 11, 4, 2, 15, 2, 1, 2, 379
)), row.names = c(NA, -75L), class = c("tbl_df", "tbl", "data.frame"
))

类:

tibble [75 x 3] (S3: tbl_df/tbl/data.frame)
 $ s2_vervoermiddel_werkstudie_voor: chr [1:75] "Auto (bestuurder)" "Auto (bestuurder)" "Auto (bestuurder)" "Auto (bestuurder)" ...
 $ s2_vervoermiddel_werkstudie_na  : chr [1:75] "Auto (bestuurder)" "Auto (passagier)" "Trein" "Bus/Tran/Metro" ...
 $ Freq                            : num [1:75] 441 2 11 1 21 12 3 3 3 46 ...

您需要根据第一个轴变量指定填充颜色。考虑到标签的大小和某些节点的限制 space,标签将很难放置,但像这样的东西可能对你有用:

library(ggplot2)
library(ggalluvial)
ggplot(data = modechoice,
       aes(y = Freq, axis1 = s2_vervoermiddel_werkstudie_voor, 
           axis2 = s2_vervoermiddel_werkstudie_na)) +
  geom_alluvium(aes(fill = s2_vervoermiddel_werkstudie_voor),
                width = 1/12) +
  geom_stratum(width = 1/12, fill = "black", color = "grey") +
  geom_text(x = 0.95, stat = "stratum", 
            aes(label = s2_vervoermiddel_werkstudie_voor),
              color = 'black', hjust = 1) +
  geom_text(x = 2.05, stat = "stratum", 
            aes(label = s2_vervoermiddel_werkstudie_na),
            color = 'black', hjust = 0) +
  scale_x_discrete(limits = c("Before", "After"), expand = c(.2, .2)) +
  ggtitle("Mode choice before corona and expected after") +
  theme_void() +
  theme(legend.position = 'none')

示例:


ggplot(data = modechoice %>%
           ## remove NAs
           filter(!is.na(s2_vervoermiddel_werkstudie_voor) &
                  !is.na(s2_vervoermiddel_werkstudie_na)),
       aes(y = Freq, axis1 = s2_vervoermiddel_werkstudie_voor, axis2 = s2_vervoermiddel_werkstudie_na)) +
    geom_alluvium(width = 1/12,
                  ## link alluvium colors to variable:
                  aes(fill = s2_vervoermiddel_werkstudie_voor)
                  ) +
    geom_stratum(width = 1/12,
                 ## change black stratum color here:
                 fill = "red",
                 color = "grey") +
    ## change geom_label to geom_text for leaner appearance:
    geom_text(stat = "stratum",
              aes(label = after_stat(stratum)),
              ## rotate labels if desired:
              angle = 0,
              ## left- and right-adjust labels
              hjust = c(rep(c(0,1),each = 9))
              ) +
    scale_x_discrete(limits = c("Before", "After"), expand = c(.05, .05)) +
    scale_fill_brewer(type = "qual", palette = "Set1",
                      ## skip color legend:
                      guide = 'none'
                      ) +
    ggtitle("Mode choice before corona and expected after")

按 cumsum of Freq 使用 fct_reorder 订购。时间仓促,不好意思没把代码弄出来。