geom_text的位置参数以设置不同的标签

时间:2019-06-06 21:03:31

标签: r ggplot2 geom-text

我希望在每个堆叠的条形图中都包含三个标签。我希望它出现在每个栏的顶部,表示每个处理变量(x轴)的观测总数。我希望其他两个标签显示每个性别的观察次数,每个变量在每个治疗变量的每个性别选项中间。

我对geom_text代码有疑问,因为我不知道应该尝试什么位置。我输入了不同的选项,但是当我这样做时,我的图形就会像这样失真。

enter image description here

这是我正在使用的代码

Data1 %>% 
  count(Treatment, Gender) %>% 
  ggplot(aes(Treatment, n))+ 
  geom_col(aes(fill = Gender), position = "fill")+
  ggtitle("Gender")+
  ylab("Fraction")+
  theme(axis.text.x = element_text(angle = 90, vjust=0.3, hjust=1))+
  scale_fill_manual("Gender", 
                    values = c("Female" = "pink", "Male" = "light blue",
                               "Other"="coral", "Prefer not to answer"="violet"))+
  geom_text(aes(label=n), position=position_stack(vjust=0.5))

如果我已正确阅读其他帖子,position_stack应该将数字放在每个小节内。

1 个答案:

答案 0 :(得分:1)

如果用position = "fill"绘制列,则geom_text必须调用相同的position_fill
在此示例中,我将使用下面转换的内置数据集mtcars的子集。

library(ggplot2)
library(dplyr)

Data1 %>% 
  count(Treatment, Gender) %>%
  ggplot(aes(x = Treatment, y = n, fill = Gender)) + 
  geom_col(position = "fill") +
  ggtitle("Gender") +
  ylab("Fraction") +
  theme(axis.text.x = element_text(angle = 90, vjust=0.3, hjust=1)) +
  scale_fill_manual("Gender", 
                    values = c("Female" = "pink", "Male" = "light blue",
                               "Other"="coral", "Prefer not to answer"="violet")) +
  geom_text(aes(label = n), position = position_fill(vjust=0.5))

enter image description here

要将条形图的总和放在顶部,下面的代码还计算每个Treatment的总数,并仅保留Treatment每组的第一个,将NA分配给其他元素的SumN

Data1 %>% 
  count(Treatment, Gender) %>%
  group_by(Treatment) %>% 
  mutate(SumN = sum(n),
         SumN = c(SumN[1], rep(NA, length(SumN) - 1))) %>%
  ungroup() %>%
  ggplot(aes(x = Treatment, y = n, fill = Gender)) + 
  geom_col(position = "fill") +
  ggtitle("Gender") +
  ylab("Fraction") +
  theme(axis.text.x = element_text(angle = 90, vjust=0.3, hjust=1)) +
  scale_fill_manual("Gender", 
                    values = c("Female" = "pink", "Male" = "light blue",
                               "Other"="coral", "Prefer not to answer"="violet")) +
  geom_text(aes(label = n), position = position_fill(vjust=0.5)) +
  geom_text(aes(y = 1.1, label = SumN), position = position_fill(vjust = 1.2))

enter image description here

数据示例。

Data1 <- mtcars[mtcars$carb %in% 1:4, c("cyl", "carb")]
names(Data1) <- c("Treatment", "Gender")
Data1$Treatment <- factor(Data1$Treatment)
Data1$Gender <- factor(Data1$Gender, 
                       labels = c("Female", "Male", "Other", "Prefer not to answer"))