p <- ggplot(mtcars, aes(wt, mpg, label = rownames(mtcars))) p + geom_text() # Avoid overlaps p + geom_text(check_overlap = TRUE) # Labels with background p + geom_label() # Change size of the label p + geom_text(size = 10) # Set aesthetics to fixed value p + geom_point() + geom_text(hjust = 0, nudge_x = 0.05) p + geom_point() + geom_text(vjust = 0, nudge_y = 0.5) p + geom_point() + geom_text(angle = 45) ## Not run: # # Doesn't work on all systems # p + geom_text(family = "Times New Roman") # ## End(Not run) # Add aesthetic mappings p + geom_text(aes(colour = factor(cyl))) p + geom_text(aes(colour = factor(cyl))) + scale_colour_discrete(l = 40) p + geom_label(aes(fill = factor(cyl)), colour = "white", fontface = "bold") p + geom_text(aes(size = wt)) # Scale height of text, rather than sqrt(height) p + geom_text(aes(size = wt)) + scale_radius(range = c(3,6)) # You can display expressions by setting parse = TRUE. The # details of the display are described in ?plotmath, but note that # geom_text uses strings, not expressions. p + geom_text(aes(label = paste(wt, "^(", cyl, ")", sep = "")), parse = TRUE) # Add a text annotation p + geom_text() + annotate("text", label = "plot mpg vs. wt", x = 2, y = 15, size = 8, colour = "red") # Aligning labels and bars -------------------------------------------------- df <- data.frame( x = factor(c(1, 1, 2, 2)), y = c(1, 3, 2, 1), grp = c("a", "b", "a", "b") ) # ggplot2 doesn't know you want to give the labels the same virtual width # as the bars: ggplot(data = df, aes(x, y, fill = grp, label = y)) + geom_bar(stat = "identity", position = "dodge") + geom_text(position = "dodge") # So tell it: ggplot(data = df, aes(x, y, fill = grp, label = y)) + geom_bar(stat = "identity", position = "dodge") + geom_text(position = position_dodge(0.9)) # Use you can't nudge and dodge text, so instead adjust the y postion ggplot(data = df, aes(x, y, fill = grp, label = y)) + geom_bar(stat = "identity", position = "dodge") + geom_text(aes(y = y + 0.05), position = position_dodge(0.9), vjust = 0) # To place text in the middle of each bar in a stacked barplot, you # need to do the computation yourself df <- transform(df, mid_y = ave(df$y, df$x, FUN = function(val) cumsum(val) - (0.5 * val))) ggplot(data = df, aes(x, y, fill = grp, label = y)) + geom_bar(stat = "identity") + geom_text(aes(y = mid_y)) # Justification ------------------------------------------------------------- df <- data.frame( x = c(1, 1, 2, 2, 1.5), y = c(1, 2, 1, 2, 1.5), text = c("bottom-left", "bottom-right", "top-left", "top-right", "center") ) ggplot(df, aes(x, y)) + geom_text(aes(label = text)) ggplot(df, aes(x, y)) + geom_text(aes(label = text), vjust = "inward", hjust = "inward") Run the code above in your browser using DataLab