Add percentage labels to a stacked barplot

18,160

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)

enter image description here

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:

enter image description here

Share:
18,160
David
Author by

David

Updated on June 09, 2022

Comments

  • David
    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. Graph

    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.