我意识到这个问题已经存在多个实例,但它们都没有真正为我提供答案。所以我得到了这个(已经融化的)数据框:
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"))
这给了我以下条形图:
现在我想在条形图的蓝色部分添加百分比。红色部分是订阅者的总数,蓝色部分是通过的数量。因此,在我的示例中,这些百分比应该变为
df$Value[2]*100/df$Value[1]
df$Value[4]*100/df$Value[3]
由于我已经掌握了大量这些数据框,我真的不想手动完成。我已经在stackoverflow上看到了一些示例,其中文本和百分比计算都已在ggplot
中实现,并且在使用ggplot
之前计算了百分比,但我担心我的数据准备工作是&n很容易做到这一点很好。
我尝试的事情:
#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
。我想我应该将值Percentage
与Var1
分开,但我还没有能够解决这个问题。
非常感谢任何帮助!
答案 0 :(得分: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))