Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to show percentages in stacked column with ggplot geom_bar? [duplicate]

I'm trying to add percentage labels in a stacked bar chart. What can I add to my geom_bar to show the percentage labels inside stacked bars?

This is my data:

myresults=data.frame(
    manipulation=rep(c(-20,-10,0,10,20,-20,-10,0,10,20,-20,-10,0,10,20)),
    variable=rep(c("a","a","a","a","a","f","f","f","f","f","l","l","l","l","l")),
    value=c(73,83,76,75,78,261,301,344,451,599,866,816,780,674,523))

This is my bar chart, without percentage labels.

I have little knowledge in this. I googled "gglot stacked bar percentage label" and found that adding percentage labels could be done with "+ geom_text(stat="count")".

But when I added + geom_text(stat="count") to my ggplot geom_bar, R said "Error: stat_count() must not be used with a y aesthetic." I tried to figure out what a y aesthetic is, but it hasn't been very successful.

This is what I did:

mydata <- ggplot(myresults, aes(x=manipulation, y=value, fill=variable))

mydata + geom_bar(stat="identity", position="fill", colour="black") + scale_fill_grey() + scale_y_continuous(labels=scales::percent) + theme_bw(base_family="Cambria") + labs(x="Manipulation", y=NULL, fill="Result") + theme(legend.direction="vertical", legend.position="right")
like image 676
Hyeonjeong Avatar asked Oct 30 '25 12:10

Hyeonjeong


2 Answers

You can do something similar to the accepted answer in: Adding percentage labels to a bar chart in ggplot2. The main difference is that your values are piled up( "stacked") whereas in that example it is side by side ("dodged")

Make a column of percentages:

myresults_pct <- myresults %>% 
group_by(manipulation) %>% 
mutate(pct=prop.table(value))

Now we plot this:

    ggplot(myresults_pct, 
aes(x=manipulation, y=pct,fill=variable)) + 
geom_col()+
scale_fill_grey()+
geom_text(aes(label = scales::percent(pct)),
position="stack",vjust=+2.1,col="firebrick",size=3)+
scale_y_continuous(label = scales::percent)

The important parameters in geom_text is position="stacked", and play around with vjust, to move up or down your label. (I apologize in advance for the awful text color..).

enter image description here

like image 189
StupidWolf Avatar answered Nov 01 '25 04:11

StupidWolf


You can try tu create the position of geom text and put it on the bars:

mydata[, label_ypos := cumsum(value), by = manipulation]

ggplot(myresults, aes(x=manipulation, y=value, fill=variable)) + 
geom_bar(stat="identity", position="fill", colour="black") +
geom_text(aes(y=label_ypos, label= paste(round(rent, 2), '%')), vjust=2, 
        color="white", size=3.5) +
scale_y_continuous(labels = scales::percent) +
labs(x = "Manipulation", y=NULL, fill="Result") +
theme_bw(base_family = "Cambria") +
theme(legend.direction = "vertical", legend.position = "right") +
scale_fill_grey() 
like image 31
K. Peltzer Avatar answered Nov 01 '25 05:11

K. Peltzer



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!