R 如何在条形顶部添加计数,以及条形内部填充的百分比?

R 如何在条形顶部添加计数,以及条形内部填充的百分比?,r,ggplot2,label,percentage,stacked-chart,R,Ggplot2,Label,Percentage,Stacked Chart,我有一些数据,其中每个观察值包含2个因素,类别(a和E之间的字母)和标志(0或1)。在应用group_by(classes,flag)和SUMMARY(frequency=n())之后,我得到了一个与此类似的数据帧: classes <-as.factor(c("A", "A", "B", "B", "C", "C", "D", "D", "E", "E")) flag <- as.factor(rep(c(0,1),10)) quantity <- c(856

我有一些数据,其中每个观察值包含2个因素,类别(a和E之间的字母)和标志(0或1)。在应用group_by(classes,flag)和SUMMARY(frequency=n())之后,我得到了一个与此类似的数据帧:

classes <-as.factor(c("A", "A", "B", "B", "C", "C", "D", "D", "E", "E"))
    flag <- as.factor(rep(c(0,1),10))
    quantity <- c(856, 569, 463, 125, 795, 313, 1000, 457, 669, 201)
    df <- data.frame(classes, flag, quantity)
但是,我不知道如何使用geom_text()来包含每个条顶部的总计数和条内填充值的比例


谢谢你的帮助

我不知道如何实现自动化,也许在绘图之外计算比例和总和是最简单的方法

在绘图外重新排序类更容易,这样文本就可以接管因子级别

df$x <- reorder(df$classes, -df$quantity)
然后我们让
text_df$class
采用与
df$x
相同的顺序

text_df$class <- factor(text_df$class, levels = levels(df$x))
并为文本添加两个几何体,一个表示比例,一个表示总和;两者都具有y偏移

 +geom_text(data = text_df, 
            aes(x = class, 
                y = sum + 100, # some offset
                label = sum)) +
  geom_text(data = text_df,
            aes(x = class, 
                y = sum - 100, # opposite offset
                label = scales::percent(prop)))

我想这就成功了。祝你好运

非常感谢你的回答!很明显,我不得不修改一些东西来获得我想要的东西,但是你的代码做到了。但有一件事需要修改。为了在创建
text_df
时获得值标志==1的比例,应该像这样创建prop列
prop=sapply(split(df$quantity,df$classes),function(x){x[2]/(x[1]+x[2])
text_df$class <- factor(text_df$class, levels = levels(df$x))
ggplot(df, aes(x = x, y = quantity)) +
  geom_bar(aes(fill = as.factor(flag)), stat="identity") +
  theme(axis.text.x=element_text(angle = 90, hjust = 1)) +
  labs(x = NULL, y = "Quantity", fill = "flag") +
  scale_fill_manual(values=c("firebrick","dodgerblue4"), 
                    labels=c("1"="Yes","0"="No"))+
  theme(axis.ticks = element_blank())
 +geom_text(data = text_df, 
            aes(x = class, 
                y = sum + 100, # some offset
                label = sum)) +
  geom_text(data = text_df,
            aes(x = class, 
                y = sum - 100, # opposite offset
                label = scales::percent(prop)))