如何将计数标签添加到 R ggplot 中的百分比条形图?

How do I add count labels to a percentage barplot in R ggplot?

假设我们想使用 R ggplot 生成一个条形图,显示某个类别变量在另一个类别变量中的百分比。下面是 R 中的一个小数据框和一些代码,以获得我想要的漂亮的条形图。

MYDATA <- data.frame(Region = c(1, 1, 2, 2, 3, 3, 4, 4, 5, 5),
                     Sex    = c("M", "F", "M", "F", "M", "F", "M", "F", "M", "F"),
                     Count  = c(185, 130, 266, 201, 304, 283, 102, 60, 55, 51))

library(ggplot2)

ggplot(data = MYDATA, aes(x = Region, y = Count, fill = Sex)) + 
       geom_bar(position = "fill", stat = 'identity') + 
       scale_y_continuous(labels = scales::percent) +   
       scale_fill_manual(values = c("Maroon1", "RoyalBlue1")) +
       ggtitle("Figure 1: Sex breakdown by Region") +
       xlab("Region") + ylab("Percentage")

现在,我想通过添加在条形图内显示原始计数值的文本来补充此条形图。对于女性,我希望计数显示在图表顶部的粉红色条内。对于男性,我希望计数显示在图表底部的蓝色条内。我试过使用 geom_text 但我不知道如何将标签放在我想要的地方。相反,我的尝试通常导致将计数值置于它们自己的值,这破坏了图中百分比的比例。 有学识的人能告诉我如何在不破坏其余绘图的情况下将原始计数值作为文本添加到条中吗?

好吧,所以在 post 解决这个问题后,我想出了一个解决方案。尽管回答了我自己的问题(抱歉,伙计们),我还是会把这个 post 保留下来,以防有人遇到他们需要解决的相同问题。请随时添加其他解决方案。

最终奏效的技巧是通过两次调用 geom_textifelse 命令一次只为一种性别输入标签来分解问题,为每种性别指定单独的标签, 和手动 y-positioning 在每个语句中的期望高度。这是代码和情节:

ggplot(data = MYDATA, aes(x = Region, y = Count, fill = Sex)) + 
       geom_bar(position = "fill", stat = 'identity') + 
       geom_text(aes(label = ifelse(Sex == "F", Count, "")), y = 0.95) +
       geom_text(aes(label = ifelse(Sex == "M", Count, "")), y = 0.05) +
       scale_y_continuous(labels = scales::percent) +   
       scale_fill_manual(values = c("Maroon1", "RoyalBlue1")) +
       ggtitle("Figure 1: Sex breakdown by Region") +
       xlab("Region") + ylab("Percentage");