Add percentage labels to a stacked barplot
Solution 1
You could do something like this...
#set positions for labels
example.melt$labelpos <- ifelse(example.melt$variable=="percent.bad",
example.melt$value/2, 1 - example.melt$value/2)
ggplot(example.melt, aes(x=example.Category, y=value, fill = variable)) +
geom_bar(position = "fill", stat = "identity",color='black',width=0.9) +
scale_y_continuous(labels = scales::percent) +
#use positions to plot labels
geom_text(aes(label = paste0(100*value,"%"),y=labelpos),size = 3)
Solution 2
This would give you the asnwer:
ggplot(example.melt, aes(x=example.Category, y=value, fill = variable)) +
geom_bar(position = "fill", stat = "identity",color='black',width=0.9) +
scale_y_continuous(labels = scales::percent) +
geom_text(aes(label = paste0(value*100,"%")),
position = position_stack(vjust = 0.5), size = 2)
Plot would look like this:
David
Updated on June 09, 2022Comments
-
David almost 2 years
I have successfully made a stacked barplot in R where the percentages add up to 100% for several different categories. I made an example dataframe here.
example.Category<- c("Cat1","Cat2","Cat3","Cat4","Cat5","Cat6") percent.good <- c(.25,.29,.45,.5,.8,.82) example.data <- data.frame(example.Category,percent.good) example.data$percent.bad <- (1-example.data$percent.good)
The dataframe looks like this.
example.Category percent.good percent.bad 1 Cat1 0.25 0.75 2 Cat2 0.29 0.71 3 Cat3 0.45 0.55 4 Cat4 0.50 0.50 5 Cat5 0.80 0.20 6 Cat6 0.82 0.18
I then used melt from the reshape package to get this...
example.melt <- melt(example.data, id.vars="example.Category") example.Category variable value 1 Cat1 percent.good 0.25 2 Cat2 percent.good 0.29 3 Cat3 percent.good 0.45 4 Cat4 percent.good 0.50 5 Cat5 percent.good 0.80 6 Cat6 percent.good 0.82 7 Cat1 percent.bad 0.75 8 Cat2 percent.bad 0.71 9 Cat3 percent.bad 0.55 10 Cat4 percent.bad 0.50 11 Cat5 percent.bad 0.20 12 Cat6 percent.bad 0.18
Then I used ggplot to make a stacked barplot displaying these percentages.
ggplot(example.melt, aes(x=example.Category, y=value, fill = variable)) + geom_bar(position = "fill", stat = "identity",color='black',width=0.9) + scale_y_continuous(labels = scales::percent) + geom_text(aes(label = paste0((example.data$percent.good && example.data$percent.bad)*100), '%'),position = position_dodge(width = .9),size = 3)
This yields this graph, which is what I want, except for the way it labels.
What I want to do is have percentage labels for each color on each stacked bar, and I have no idea how to do that and am certain that I didn't do it right. All I managed to do was somehow create another category that has some '100's around. How would I get the percent labels to appear on this graph for each part of the bar?
I hope this isn't redundant/asked before. Thanks.