ggalluvial geom_text повторяется

Я хотел бы использовать geom_text в создаваемых мною галлювиальных графиках. Приведенный ниже код работает должным образом, если между уровнями производительности нет равного распределения 50/50. Есть ли в geom_text() аргумент для предотвращения повторения текста на geom_stratum(aes(fill = profEOY))? Короче говоря, результаты за 2018 год выглядят так, как ожидалось, результаты за 2019 год с разделением 50/50 проблематичны.

Я показываю этот график для более 160 сайтов отчетности в Shiny, поэтому не думаю, что annotate () будет работать.

      library(tidyverse)
library(ggalluvial)
df <-
  structure(
    list(
      profBOY = c(
        "At or Above",
        "At or Above",
        "Below or Well Below",
        "Below or Well Below",
        "At or Above",
        "At or Above",
        "Below or Well Below",
        "Below or Well Below"
      ),
      profEOY = c(
        "At or Above",
        "Below or Well Below",
        "At or Above",
        "Below or Well Below",
        "At or Above",
        "Below or Well Below",
        "At or Above",
        "Below or Well Below"
      ),
      EndYear = c(
        2018L,
        2018L,
        2018L,
        2018L,
        2019L,
        2019L,
        2019L,
        2019L
      ),
      sum = c(37, 0, 6, 21, 27, 3, 5, 22),
      totaln = c(74L,
                 74L, 74L, 74L, 80L, 80L, 80L, 80L),
      totalNBoy = c(68, 68, 68, 68, 64, 64, 64, 64),
      totalInBoyPB = c(
        "38",
        "38",
        "30",
        "30",
        "32",
        "32",
        "32",
        "32"
      ),
      percentInBoyPB = c(55.9, 55.9, 44.1, 44.1,
                         50, 50, 50, 50),
      totalNEoy = c(69, 69, 69,
                    69, 73, 73, 73, 73),
      totalInEoyPB = c(
        "44",
        "25",
        "44",
        "25",
        "34",
        "39",
        "34",
        "39"
      ),
      percentInEoyPB = c(63.8, 36.2, 63.8, 36.2, 46.6, 53.4, 46.6, 53.4),
      percent = c(
        "50%",
        "0%",
        "8%",
        "28%",
        "34%",
        "4%",
        "6%",
        "28%"
      )
    ),
    row.names = c(NA,-8L),
    class = c("tbl_df", "tbl", "data.frame")
  )

ggplot(df,
       aes(y = sum,
           axis1 = str_wrap(profBOY, 10),
           axis2 = str_wrap(profEOY, 10),
           fill = profBOY
       )) +
  geom_flow(color = '#e57a3c', curve_type = 'quintic') +
  scale_x_discrete(limits = c("Beginning \nof Year", "End \nof Year")) +
  scale_fill_manual(values = c("#315683","#6c7070")) +
  geom_stratum(aes(fill = profEOY), color = 'grey', width = 1/2) +
  geom_stratum(aes(fill = profBOY), color = 'grey', width = 1/2) +
  geom_text(stat = 'stratum', 
            aes(label = paste0(percentInBoyPB, '%')), 
            vjust = 1, size = 4, color = 'white')+
  labs(fill = 'Performance Level')+
  facet_wrap(vars(factor(EndYear)), 
             nrow = 1, 
             scales = 'free_y')+
  theme_minimal()+
  theme(axis.text.y = element_blank(), 
        axis.title.y = element_blank(), 
        axis.ticks = element_blank(),
        panel.grid = element_blank(), 
        legend.position = 'top', 
        legend.text = element_text(size = 12),
        legend.title = element_text(size = 14),
        axis.text.x = element_text(size = 16), 
        strip.text = element_text(size = 18), 
        strip.background = element_rect(fill = 'lightgrey', color = 'lightgrey')
  )

Спасибо за любой совет!

1 ответ

Я думаю, что для решения этой проблемы «самой чистой» идеей было бы преобразовать данные в «длинный» (или Lodes) формат. Это значительно упрощает управление метками слоев.

Есть еще один способ контролировать это с помощью after_stat()функция, которая восстанавливает переменные, полученные с помощью статистического преобразования для построения аллювиального слоя.

В случае, если вы пишете aes(label = after_stat(x)), страты будут иметь следующие метки:

Теперь вы можете увидеть переменную, записанную на соответствующем слое. Мы также можем видеть, что xсоответствуют аллювиальной оси: первая ось (начало года) — «1», а вторая ось (конец года) — «2».

Зная это, теперь вы можете управлять этикеткой, которую хотите написать, с помощью простого ifelse()утверждение.

Таким образом, мое решение состояло в изменении эстетики geom_text()написав aes(label = ifelse(test = after_stat(x) == "1", paste0(df$percentInBoyPB, '%'), ""))чтобы получить:

Весь ggplot был:

      ggplot(df,
       aes(y = sum,
           axis1 = str_wrap(profBOY, 10),
           axis2 = str_wrap(profEOY, 10),
           fill = profBOY
       )) +
  geom_flow(color = '#e57a3c', curve_type = 'quintic') +
  scale_x_discrete(limits = c("Beginning \nof Year", "End \nof Year")) +
  scale_fill_manual(values = c("#315683","#6c7070")) +
  geom_stratum(aes(fill = profEOY), color = 'grey', width = 1/2) +
  geom_text(stat = 'stratum', 
            aes(label = ifelse(test = after_stat(x) == "1", paste0(df$percentInBoyPB, '%'), "")), 
            vjust = 1, size = 4, color = 'white')+
  labs(fill = 'Performance Level')+
  facet_wrap(vars(factor(EndYear)), 
             nrow = 1, 
             scales = 'free_y')+
  theme_minimal()+
  theme(axis.text.y = element_blank(), 
        axis.title.y = element_blank(), 
        axis.ticks = element_blank(),
        panel.grid = element_blank(), 
        legend.position = 'top', 
        legend.text = element_text(size = 12),
        legend.title = element_text(size = 14),
        axis.text.x = element_text(size = 16), 
        strip.text = element_text(size = 18), 
        strip.background = element_rect(fill = 'lightgrey', color = 'lightgrey')
  )
Другие вопросы по тегам