Skip to content
RDocumentation: geom_label
  • AI Chat
  • Code
  • Report
  • if(!require('ggplot2')) {
        install.packages('ggplot2')
        library('ggplot2')
    }
    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)
    # Doesn't work on all systems
    p +
      geom_text(family = "Times New Roman")
    # 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, group = grp)) +
      geom_col(aes(fill = grp), position = "dodge") +
      geom_text(aes(label = y), position = "dodge")
    # So tell it:
    ggplot(data = df, aes(x, y, group = grp)) +
      geom_col(aes(fill = grp), position = "dodge") +
      geom_text(aes(label = y), position = position_dodge(0.9))
    # Use you can't nudge and dodge text, so instead adjust the y position
    ggplot(data = df, aes(x, y, group = grp)) +
      geom_col(aes(fill = grp), position = "dodge") +
      geom_text(
        aes(label = y, 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 set the vjust parameter of position_stack()
    ggplot(data = df, aes(x, y, group = grp)) +
     geom_col(aes(fill = grp)) +
     geom_text(aes(label = y), position = position_stack(vjust = 0.5))
    
    # 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")