Как использовать Аллювиальный график (или диаграмму Санки), чтобы показать изменение категорий с течением времени с помощью 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"))