повторение ggalluvial geom_text

#r #ggalluvial

Вопрос:

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

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

Примерный Сюжет

 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:

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

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

В geom_text() случае, если вы напишете aes(label = after_stat(x)) , слои будут иметь следующие метки: Намывной_плот_экзамен_1

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

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

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

Намывной_плот_экзамен_2

Весь 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')
  )