如何在ggplot的条形图中添加文本

3

我知道这个问题已经有多个实例了,但是没有一个能真正为我提供答案。所以我有这样一个(已经融化)的数据框:

df <-data.frame(
     Var1 = c("Inschrijvingen", "BSA", "Inschrijvingen", "BSA"),
     Var2 = c("Totaal","Totaal", "OD_en_MD", "OD_en_MD"),
     Value = c(262, 190, 81, 69)
)

请注意,这只是数据框的一小部分,并且我有很多类似的数据框。我是用以下方法制作堆积条形图的:

ggplot(df, aes(Var2, as.numeric(as.character(value)), fill=Var1))+ 
  geom_bar(position="identity", stat="identity") +
  scale_alpha_manual(values=c(.6,.8)) + 
  ggtitle(names(df)) + labs(x="", y="Aantal") + 
  scale_colour_brewer(palette = "Set2") +
  scale_fill_discrete("BSA Resultaten", labels=c("BSA niet behaald", "BSA behaald"))

这给我带来了以下的条形图:

Received Bar Chart

现在我想要在蓝色部分的条形图上添加百分比。红色部分是订阅者总数,蓝色部分是通过的数量。因此,在我的例子中,这些百分比应该变成

df$Value[2]*100/df$Value[1]
df$Value[4]*100/df$Value[3]

自从我有了这么多数据框,我不想手动处理。我在stackoverflow上看到过一些示例,其中文本和百分比计算都在ggplot中实现,还有一些示例是先在ggplot之前计算百分比,但我担心我的数据准备工作做不到那么简单。

我尝试过的事情:

#ddply, to add a column with percentages:
ddply(df2, .(Var2), transform, percent=value*100/value)

问题在于我的百分比计算。我该如何让ddply选择和乘以正确的值?这是否本来就是正确的方式?

   #Calculating percentages before melting the data frame, which gives me the (molten) data frame:
    df2 <- data.frame( 
      Var1 =c("Inschrijvingen", "BSA","Percentage","Inschrijvingen", 
            "BSA","Percentage"),
      Var2 =c("Totaal","Totaal","Totaal","OD_en_MD","OD_en_MD","OD_en_MD"),
      Value = c(262,190,72.5,81,69,85.2)
)

问题在于我不知道如何在没有绘制百分比的情况下将其传递到ggplot中。我想我应该将PercentageVar1中分离出来,但我还没有成功做到这一点。
任何帮助都将不胜感激!
1个回答

0
library(dplyr)
df <- df %>%
  group_by(Var2) %>%
  mutate(Max = max(Value), Min = min(Value), Per = round(Min*100/Max, 2))%>%
  arrange(Var2)

ggplot(df, aes(Var2, as.numeric(as.character(Value)), fill=Var1))+ 
  geom_bar(position="identity", stat="identity") +
  scale_alpha_manual(values=c(.6,.8)) + 
  ggtitle(names(df)) + labs(x="", y="Aantal") + 
  scale_colour_brewer(palette = "Set2") +
  scale_fill_discrete("BSA Resultaten", labels=c("BSA niet behaald", "BSA behaald"))+
  annotate("text", x = 1:length(unique(df$Var2)), y=rep(min((unique(df$Max)-unique(df$Min))),2), label = unique(df$Per))

你是否有办法让你创建的Max列成为Var2中所有相等值的最大值?Max将变为:c(262, 262, 81, 81)。Min列也需要同样的操作,现在它们都是一个包含262和69的列。 - Kasper
抱歉,我没有看到问题。你能更具体地描述一下吗? - And_R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接