Как использовать Аллювиальный график (или диаграмму Санки), чтобы показать изменение категорий с течением времени с помощью R

Я пытаюсь использовать аллювиальный график (диаграмму Санки), чтобы показать изменение различных категорий за два периода времени. Мне удалось создать график, который имеет для меня смысл, когда все уровни факторов представлены в обоих периодах времени (до и после), но с моими данными график выглядит странно после изменения порядка факторов. Я также хотел бы показать одинаковые цвета заливки для категорий из обоих периодов времени, но могу изменить только первый период времени (до). Когда я рисую график, я замечаю, что цвета, которые я указываю, не те, которые я хочу для каждого из уровней факторов, несмотря на то, что порядок ящиков / страты правильный.

Любая помощь или совет о том, как улучшить график и как я могу решить проблему упорядочивания уровней факторов из обеих групп, когда категории не полностью представлены в оба периода времени, были бы очень полезны.

Вот код:

          # Data
    db <- data.frame(pre = rep(c("DD", "LC", "NT",
                               "VU", "EN", "CR"), each = 6),
                     post = rep(c("DD", "LC", "NT",
                                  "VU", "EN", "CR"), times = 6),
                     freq = rep(sample(seq(0:20), 6), 6))
    
    # Order factor levels
    levels(db$pre) <- c("DD", "LC", "NT", "VU", "EN", "CR")
    levels(db$post) <- c("DD", "LC", "NT", "VU", "EN", "CR")
    
    # Set colors for the plor
    colors.p <- c("#7C7C7C", "#20AB5F", "#3EFF00", 
                  "#FBFF00", "#FFBD00", "#FF0C00")
    
    # Plot
    p <- ggplot(db,
                aes(y = freq, axis1 = pre, 
                    axis2 = post)) +
        geom_alluvium(aes(fill = pre), show.legend = FALSE) +
        geom_stratum(aes(fill = pre), color = "black", alpha = 0.5) +
        geom_label(stat = "stratum", aes(label = after_stat(stratum))) +
        scale_x_discrete(limits = c("previous", "current"), 
                         expand = c(0.3, 0.01)) +
        scale_fill_manual(values = colors.p) +
        theme_void() +
        theme(
            panel.background = element_blank(),
            axis.text.y = element_blank(),
            axis.text.x = element_text(size = 15, face = "bold"),
            axis.title = element_blank(),
            axis.ticks = element_blank(),
            legend.position = "none"
        )
    
    p  


1 ответ

Я это с другим пакетом, который мне больше знаком ( попробовалggsankey ). Я также удалил по одной категории из каждой временной точки, чтобы проиллюстрировать изменение порядка факторов и то, что это возможно. Решает ли это ваши проблемы? Если нет, поясните, что вам все еще не хватает.

      library(tidyverse)
library(ggsankey)

db <- data.frame(pre = rep(c("DD", "LC", "NT",
                             "VU", "EN", "CR"), each = 6),
                 post = rep(c("DD", "LC", "NT",
                              "VU", "EN", "CR"), times = 6),
                 freq = rep(sample(seq(0:20), 6), 6))
db %>% 
  uncount(freq) %>%
  filter(pre != "DD", post != "NT") %>%
  make_long(pre, post) %>%
  mutate(node = fct_relevel(node, "LC", "NT", "VU", "EN", "CR"), 
         next_node = fct_relevel(next_node, "DD", "LC", "VU", "EN", "CR")) %>%
  ggplot(aes(x = x, 
             next_x = next_x, 
             node = node, 
             next_node = next_node,
             fill = factor(node))) +
  geom_alluvial() +
  scale_fill_manual(values = c("DD" = "#7C7C7C", "LC" = "#20AB5F", "NT" = "#3EFF00", "VU" = "#FBFF00", "EN" = "#FFBD00", "CR" = "#FF0C00"))

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