В R, ggplot для пирамиды населения: как выровнять метки рядом с осью с geom_bar geom_label после переключения координат - PullRequest
0 голосов
/ 06 февраля 2020

Я делаю своего рода популяционную пирамиду, используя ggplot (plotrix не позволяет мне создавать необычные метки и т. Д. c), затем я начинаю с geom_bar с метками, а затем я переворачиваю координаты. К сожалению, этикетки почти не видны. Я хотел бы переместить эти ярлыки рядом с «осью y» в середине, которая сейчас показывает возрастные группы. Данные здесь: d <- data.frame(age.grp2 = c("1-10", "11-20", "21-30", "31-40", "41-50", "1-10", "11-20", "21-30", "31-40", "41-50"), sex = c("Female","Female","Female","Female","Female","Male","Male","Male","Male","Male" ), n.enroll = c(288,500,400,300,200,300,460,300,200,300), proportion = c(17.1,29.6,23.7,17.8,11.8,51,47.9,42.9,40,60), proportion2 = c(-17.1,-29.6,-23.7,-17.8,-11.8,51,47.9,42.9,40,60)) Вот мой код: ggplot(d, aes(x = age.grp2, y = proportion2, fill = sex)) + geom_bar(position = position_dodge(width=1), stat='identity') + geom_label(aes(label = paste(n.enroll," (",proportion,"%)", sep=""), group = factor(sex)), fill="white", colour = "black", position= position_dodge(width=1), size = 3) + scale_fill_manual(values=c("#BFD5E3", "grey")) + facet_share(~sex, dir = "h", scales = "free", reverse_num = TRUE) + coord_flip() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), #panel.border = element_blank(), panel.background = element_blank(), legend.position = "none", #axis.line.x = element_line(color = "black"), axis.ticks.y = element_blank(), axis.text.x = element_text(colour = "black", size = 8, face = "bold", angle=0, hjust=0.5), axis.text.y = element_text(colour = "black", size = 8, face = "bold"), axis.title.x = element_text(size = 14, face="bold", margin = margin(t = 30, r = 20, b = 10, l = 20)), plot.margin = unit(c(1,1,1,1),"cm")) + labs(y = "Enrollment percentage within sex",x="") Я прилагаю также сюжет, на котором мы видим, что у женщин вырезана этикетка в возрастной группе 11-20 лет. Мне бы хотелось, чтобы все метки были расположены рядом с метками возрастной группы в каждой строке: женские метки перемещались вправо, а мужские метки перемещались влево. Кроме того, я хотел бы, чтобы каждая ось X была расширена до 100% или, по крайней мере, в том же диапазоне, у женщин она достигает 30%, а у мужчин - до 60%. Спасибо за все комментарии enter image description here

1 Ответ

0 голосов
/ 06 февраля 2020

Вот минимальное решение, использующее базовый пакет ggplot, без большинства форматирования. Ключевой частью является добавление условного y = ... в раздел geom_label(aes()):

d %>% 
  mutate(
    label = str_c(n.enroll, " (", proportion, "%)"),
    label_loc = if_else(sex == "Female", -9.5, 3),
    proportion_for_chart = if_else(sex == "Female", -proportion, proportion)
  ) %>% 
  ggplot(aes(x = age.grp2, y = proportion_for_chart, fill = sex)) +
  geom_col(show.legend = FALSE) +
  geom_label(aes(y = label_loc, label = label), size = 3, fill = "white", hjust = 0) +
  coord_flip() +
  facet_wrap(~ sex, scales = "free") +
  theme(
    axis.title = element_blank()
  )

По возможности, я стараюсь изменить данные и использовать geom_col, а не пытаться повезти с geom_bar , Вы должны быть в состоянии поиграть с различными жестко закодированными значениями y в вызове geom_label, чтобы определить правильное местоположение для ваших меток на основе вашего форматирования и размера / масштаба изображения.

enter image description here

...