Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

geom_text position middle on a bar plot

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?

like image 391
twistfire Avatar asked Nov 30 '22 22:11

twistfire


1 Answers

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

like image 90
Jake Kaupp Avatar answered Dec 04 '22 13:12

Jake Kaupp