Я думаю, что сюжет ниже делает большую часть того, что вы указали в своем ОП и комментариях. Тем не менее, я думаю, что этот график очень занят и шаблоны не настолько прозрачны, как могли бы, поэтому я добавил несколько других опций.
library(tidyverse)
pd = position_dodge(0.9)
gender %>%
mutate(sex=str_extract(sample_label, "Male|Female"),
sample_label=gsub(".*ale ", "", sample_label),
sample_label=fct_relevel(sample_label, "NCG")) %>%
ggplot(aes(x =Age_Group_, y = meanTLE_, fill=sample_label, group=sample_label)) +
# Dodge value labels and bars by same amount
geom_col(position = pd, width=0.85) +
geom_text(aes(label=sprintf("%1.1f", meanTLE_)), hjust=0,
colour = "black", fontface = "bold", size=3, angle = 90,
# Dodge value labels and bars by same amount
position = pd) +
geom_col(aes(y=meanHLE_), width=0.4, size=0.2, colour="grey50", fill="white", position=pd) +
geom_text(aes(label=sprintf("%1.1f", meanHLE_),
y=meanHLE_, colour=sample_label), position=pd,
colour = "black", fontface = "bold", size=3, angle = 90,) +
geom_text(data=. %>%
group_by(sex) %>%
filter(Age_Group_=="70-71", grepl(">=14", sample_label)) %>%
ungroup %>%
pivot_longer(starts_with("mean")), hjust=0, colour="grey30", size=3,
aes(x=3.5, y=value, label=gsub("mean(.*)_", "\\1", name))) +
facet_grid(cols=vars(sex)) +
scale_y_continuous(limits=c(0,41), expand=c(0,0)) +
expand_limits(x=3.9) +
scale_colour_manual(values=hcl(seq(15,375,length=4)[1:3], 100, 80)) +
labs(x = "Age Groups", y = "Total Life Expectancy") +
theme_bw() +
theme(legend.title=element_blank(),
legend.text = element_text(face = "bold"),
plot.title = element_text(hjust = 0.5, size = 15, colour = "Black", face = "bold"),
plot.caption = element_text(hjust = 0, color = "black", face = "bold", size=12.5))
График ниже избавляет от столбцов и использует значения в качестве маркеров точек. Я изменил данные в длинный формат, так что нам нужен только один вызов для каждого geom, чтобы отобразить значения, и мы можем сгенерировать легенду с цветовым отображением. Я добавил тонкие линии только для того, чтобы направлять взгляд. Если вы хотите удалить их, установите size=0
в geom_line
. Не избавляйтесь от вызова geom_line
, так как это необходимо для генерации легенды.
gender %>%
mutate(sex=str_extract(sample_label, "Male|Female"),
sample_label=gsub(".*ale ", "", sample_label)) %>%
pivot_longer(cols=starts_with("mean")) %>%
ggplot(aes(y=sample_label, x=value, colour=name, group=name)) +
geom_line(size=0.4, alpha=0.5) +
geom_text(aes(label=sprintf("%1.1f", value)),
fontface = "bold", size=3, show.legend=FALSE) +
facet_grid(rows=vars(sex, Age_Group_)) +
scale_x_continuous(limits=c(0,40), expand=c(0,0)) +
scale_colour_discrete(labels=c("Healthy", "Total")) +
labs(x = "Mean (years)",
title="Life expectancy by age, sex, and caregiver status") +
theme_bw() +
theme(legend.title=element_blank(),
axis.title.y=element_blank(),
legend.text = element_text(face = "bold"),
plot.title = element_text(hjust = 0.5, size = 15, face = "bold"),
plot.caption = element_text(hjust=0, color="black", face="bold", size=12.5),
strip.text.y=element_text(angle=0),
legend.position="bottom",
legend.box.margin=margin(t=-10)) +
guides(colour=guide_legend(override.aes=list(size=3, alpha=1)))
Эта версия кажется мне быть наиболее прозрачным в отношении ключевых моделей в данных. Текстовые метки значений данных накладываются друг на друга, поэтому, возможно, более эффективны уклонение или использование точечных маркеров.
gender %>%
mutate(sex=str_extract(sample_label, "Male|Female"),
sample_label=gsub(".*ale ", "", sample_label)) %>%
pivot_longer(cols=starts_with("mean")) %>%
ggplot(aes(y=value, x=Age_Group_, colour=sample_label)) +
geom_line(aes(linetype=name, group=interaction(name, sample_label)),
size=0.6, alpha=0.3) +
geom_text(aes(label=sprintf("%1.1f", value)), size=3, show.legend=FALSE) +
facet_grid(cols=vars(sex)) +
scale_y_continuous(limits=c(0,40), expand=c(0,0)) +
scale_linetype_discrete(labels=c("Healthy", "Total")) +
labs(x = "Age Group", y="years",
colour="Caregiver Status", linetype="Life Expectancy Type",
title="Life expectancy by age, sex, and caregiver status") +
theme_bw() +
theme(legend.text = element_text(face = "bold"),
plot.title = element_text(hjust = 0.5, size = 15, face = "bold"),
plot.caption = element_text(hjust = 0, color = "black", face = "bold", size=12.5)) +
guides(linetype=guide_legend(reverse=TRUE, override.aes=list(size=1)),
colour=guide_legend(override.aes=list(size=1, alpha=1)))