Аллювиальный участок с 2 разными источниками, но сходящейся / общей переменной [R]

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

вот пример данных

      library(dplyr)
library(ggplot2)
library(ggalluvial)

data <- data.frame(
  unique_alluvium_entires = seq(1:10),
  label_1 = c("A", "B", "C", "D", "E", rep(NA, 5)),
  label_2 = c(rep(NA, 5), "F", "G", "H", "I", "J"),
  shared_label = c("a", "b", "c", "c", "c", "c", "c", "a", "a", "b")
)

вот код, который я использую для создания сюжета

      #prep the data
data <- data %>%
  group_by(shared_label) %>%
  mutate(freq = n())

data <- reshape2::melt(data, id.vars = c("unique_alluvium_entires", "freq"))
data$variable <- factor(data$variable, levels = c("label_1", "shared_label", "label_2"))

#ggplot
ggplot(data,
       aes(x = variable, stratum = value, alluvium = unique_alluvium_entires,
           y = freq, fill = value, label = value)) +
  scale_x_discrete(expand = c(.1, .1)) + 
  geom_flow() +
  geom_stratum(color = "grey", width = 1/4, na.rm = TRUE) +
  geom_text(stat = "stratum", size = 4) +
  theme_void() +
  theme(
   axis.text.x = element_text(size = 12, face = "bold")
  )

(видимо я пока не могу вставлять изображения)

Как видите, я могу удалить значения, но они не складываются должным образом. Каждая уникальная строка должна накладываться друг на друга в shared_labelстолбец. Это также решит проблему с размером, чтобы они были одинакового размера по оси y.

Любые идеи, как это исправить? я пытался ggsankey но возникает та же проблема, и я не могу удалить NAценности. Любые советы приветствуются!

1 ответ

Этот график является ожидаемым результатом статистического преобразования «поток», которое используется по умолчанию для графического объекта «поток». (То есть, geom_flow()знак равно geom_flow(stat = "flow").) Похоже, вы хотите вместо этого указать статистическое преобразование «намыв». Ниже я использовал весь ваш код, но только скопировал и отредактировал ggplot()вызов.

      #ggplot
ggplot(data,
       aes(x = variable, stratum = value, alluvium = unique_alluvium_entires,
           y = freq, fill = value, label = value)) +
  scale_x_discrete(expand = c(.1, .1)) +
  geom_flow(stat = "alluvium") +  # <-- specify alternate stat
  geom_stratum(color = "grey", width = 1/4, na.rm = TRUE) +
  geom_text(stat = "stratum", size = 4) +
  theme_void() +
  theme(
    axis.text.x = element_text(size = 12, face = "bold")
  )
#> Warning: Removed 2 rows containing missing values (geom_text).

Создано 10 декабря 2021 г. пакетом reprex (v2.0.1)

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