geom_text position middle on a bar plot

13,120

With recent updates to ggplot2, you can do this by setting position = position_stack(vjust = 0.5) in geom_text().

It may also interest you that you can use geom_col() as a shortcut for geom_bar(stat = "identity"). Also, labs has a title and subtitle parameter, so you don't need to use it and ggtitle.

ggplot(data = mydf1, aes(x = year, y = channels, fill = type, frame = year, cumulative = TRUE)) +
  geom_col() +
  labs(x = "year", y = "y", title = "Data Here", subtitle = "Statistics") +
  geom_text(aes(label = channels), color = "white", size = 3, position = position_stack(vjust = 0.5)) + 
  theme_minimal()

enter image description here

Share:
13,120
twistfire
Author by

twistfire

Updated on June 24, 2022

Comments

  • twistfire
    twistfire about 2 years

    Need help with the aligning of the labels on the barplot.

    Here is the reproducible code:

    library(ggmap)
    library(ggplot2)
    library(gganimate)
    library(readxl)
    library(animation)
    
    mydf1<-structure(list(year = c(1994, 1995, 1997, 1997, 1998, 1998, 2000, 
    2000, 2001, 2001, 2002, 2002, 2004, 2005, 2005, 2006, 2006, 2007, 
    2007, 2008, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2015, 
    2016, 2016, 2016, 2016), N = c(3L, 1L, 1L, 4L, 1L, 4L, 1L, 2L, 
    1L, 5L, 1L, 2L, 1L, 1L, 4L, 1L, 3L, 1L, 2L, 1L, 5L, 2L, 2L, 6L, 
    4L, 1L, 1L, 2L, 1L, 1L, 3L, 4L, 1L), channels = c(86, 24, 24, 
    68, 6, 34, 22, 10, 14, 24, 16, 43, 4, 20, 56, 15, 20, 8, 11, 
    24, 44, 9, 23, 65, 20, 12, 5, 43, 5, 4, 24, 53, 14), 
    reliability = c(0.466666666666667, 
    1, 0.2, 0.8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), type = c("OIL", "LNG", 
    "AGS", "OIL", "LNG", "OIL", "LNG", "OIL", "LNG", "OIL", "LNG", 
    "OIL", "OIL", "LNG", "OIL", "LNG", "OIL", "LNG", "OIL", "LNG", 
    "OIL", "OIL", "OIL", "OIL", "OIL", "OIL", "LNG", "LNG", "OIL", 
    "AGS", "LNG", "LNG*", "OIL")), .Names = c("year", "N", 
    "channels", "reliability", "type"), row.names = c(NA, -33L), class = "data.frame")
    
    p3<-ggplot(data=mydf1, aes(x=year, y=channels, frame=year, cumulative=TRUE, fill=type))+
    geom_bar(stat="identity")+labs(x="year", y="y")+
    geom_text(aes(label=channels), vjust=1, color="white", size=3)+theme_minimal()+
    ggtitle("Data here", "statistics")
    p3
    

    The problem is in the positions of the labels - they don't match the corresponding bars. See the picture for explanation.

    enter image description here

    How to add labels in the middle of the corresponding bar?