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

#r #ggplot2 #sankey-diagram #ggalluvial

Вопрос:

Я делаю диаграмму Сэнки с ggalluvial помощью .

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

 library(ggsankey) library(tidyverse)  df lt;-  mtcars %gt;%  make_long(cyl, vs, am, gear, carb) %gt;%   mutate(color = c(rep("red", 80), rep("blue", 80)))  

Вы можете получить диаграмму Сэнки, подобную этой:

 df %gt;%  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 %gt;%  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. пожалуйста, укажите список использованных вами пакетов. откуда берется функция make_long()

2. Хороший момент, он есть в ggsankey упаковке

3. Неважно, ggaluvial это намного лучше

4. если вы решили проблему, поделитесь своим решением в качестве ответа, чтобы помочь другим.

Ответ №1:

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

Вот данные, формирующие:

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

А вот и сюжет с правильным цветовым потоком:

 df %gt;%   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()  

введите описание изображения здесь