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')
)