draw the sum value above the stacked bar in ggplot2

You can do this by creating a dataset of per-class totals (this can be done multiple ways but I prefer dplyr):

library(dplyr)
totals <- hp %>%
    group_by(class) %>%
    summarize(total = sum(value))

Then adding a geom_text layer to your plot, using totals as the dataset:

p + geom_bar(binwidth = 0.5, stat="identity") +  
    aes(x = reorder(class, -value, sum), y = value, label = value, fill = year) +
    theme() +
    geom_text(aes(class, total, label = total, fill = NULL), data = totals)

You can make the text higher or lower than the top of the bars using the vjust argument, or just by adding some value to total:

p + geom_bar(binwidth = 0.5, stat = "identity") +  
    aes(x = reorder(class, -value, sum), y = value, label = value, fill = year) +
    theme() +
    geom_text(aes(class, total + 20, label = total, fill = NULL), data = totals)

enter image description here


You can use the built-in summary functionality of ggplot2 directly:

ggplot(hp, aes(reorder(class, -amount, sum), amount, fill = year)) +
  geom_col() +
  geom_text(
    aes(label = after_stat(y), group = class), 
    stat = 'summary', fun = sum, vjust = -1
  )

enter image description here