#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))
, слои будут иметь следующие метки:
Теперь вы можете видеть 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')
)