Диаграмма Санки: есть ли способ раскрасить потоки в соответствии с дополнительным столбцом в галлювиале?

Я делаю диаграмму Санки с галлювиалом.

Вот мой набор данных

      library(ggsankey)
library(tidyverse)

df <-
  mtcars %>%
  make_long(cyl, vs, am, gear, carb) %>% 
  mutate(color = c(rep("red", 80), rep("blue", 80)))

Вы можете получить диаграмму Санки следующим образом:

      df %>% 
ggplot(aes(x = x, 
               next_x = next_x, 
               node = node, 
               next_node = next_node,
               fill = factor(node),
           label = factor(node))) +
  geom_sankey()+
  geom_sankey(flow.alpha = .6,
              node.color = "gray30") +
  geom_sankey_label(size = 3, color = "white", fill = "gray40") +
  scale_fill_viridis_d() +
  theme_sankey(base_size = 18) +
  labs(x = NULL) +
  theme(legend.position = "none",
        plot.title = element_text(hjust = .5))

Теперь я хочу раскрасить потоки между метками по столбцу color принадлежащий df. Является ли это возможным? Если нет, знаете ли вы другие способы сделать это в R?

Я пытался:

      df %>% 
ggplot(aes(x = x, 
               next_x = next_x, 
               node = node, 
               next_node = next_node,
               fill = factor(color),
           label = factor(node))) +
  geom_sankey()+
  geom_sankey(flow.alpha = .6,
              node.color = "gray30") +
  geom_sankey_label(size = 3, color = "white", fill = "gray40") +
  scale_fill_viridis_d() +
  theme_sankey(base_size = 18) +
  labs(x = NULL) +
  theme(legend.position = "none",
        plot.title = element_text(hjust = .5))

Но сюжет кажется полностью сломанным:

1 ответ

В конце, ggaluvialкажется более адаптированным к моей проблеме:

Вот форматирование данных:

      df <-
  mtcars %>%
  select(cyl, vs, am, gear, carb) %>% 
  mutate(color = c(rep("red", nrow(mtcars)/2), rep("blue", nrow(mtcars)/2)),
         id = seq(1:nrow(mtcars))) %>% 
  pivot_longer(cols = !c(color, id),
               names_to = "var",
               values_to = "state")

А вот и график с правильными цветами заливки:

      df %>% 
  ggplot(aes(x = var,
               stratum = state,
               label = state,
               alluvium = id)) +
      stat_alluvium(aes(fill = color),
                    width = 0,
                    alpha = 1,
                    geom = "flow")+
      geom_stratum(width = 0.2)+
      geom_text(stat = "stratum", size = 5, angle = 90)+
      theme_bw()

Другие вопросы по тегам