R ggplot geom_text 审美长度

R ggplot geom_text Aesthetic Length

我正在处理一个非常大的数据集,其中包含一个虚拟变量和一个具有 14 个水平的因子变量——我已经发布了一个示例 here。我正在尝试使用以下代码制作堆叠比例条形图:

ggplot(data,aes(factor(data$factor),fill=data$dummy))+
geom_bar(position="fill")+
ylab("Proportion")+
theme(axis.title.y=element_text(angle=0))

效果很好,几乎我需要的情节。我只想添加小文本标签来报告每个因子水平的观察次数。我的直觉告诉我这样的事情应该可行

Labels<-c("n=1853" , "n=392",  "n=181" ,  "n=80",   "n=69",   "n=32" ,  "n=10",    "n=6",    "n=4",    "n=5",    "n=3",    "n=3",    "n=2",    "n=1" ) 
ggplot(data,aes(factor(data$factor),fill=data$dummy))+
geom_bar(position="fill")+
geom_text(aes(label=Labels,y=.5))+
ylab("Proportion")+
theme(axis.title.y=element_text(angle=0))

但它吐出一个空白图表和错误 Aesthetics must either be length one, or the same length as the dataProblems:Labels

这对我来说真的没有意义,因为我知道我的因子水平的长度与我强加的标签数量的长度相同。我一直在努力弄清楚我是如何做到的可以让它只打印我需要的东西,而无需像 this example 这样的观察次数创建值向量,但无论我尝试什么,我总是得到相同的美学错误。

这个怎么样:

library(dplyr)

# Create a separate data frame of counts for the count labels
counts = data %>% group_by(factor) %>%
  summarise(n=n()) %>%
  mutate(dummy=NA)

counts$factor = factor(counts$factor, levels=0:10)

ggplot(data, aes(factor(factor), fill=factor(dummy))) +
  geom_bar(position="fill") +
  geom_text(data=counts, aes(label=n, x=factor, y=-0.03), size=4) +
  ylab("Proportion")+
  theme(axis.title.y=element_text(angle=0))

你的方法是对的,但是Labels需要是数据框,而不是向量。 geom_text 需要使用 data 参数给出数据框的名称。然后,aes 中的 label 参数告诉 geom_text 哪一列用于标签。此外,即使 geom_text 不使用 dummy 列,它也必须在数据框中,否则你会得到一个错误。