Search code examples
rggplot2geom-text

How to jitter/remove overlap for geom_text labels


Figure

In the figure, is it possible to jitter the state abbreviation labels a bit so they don't overlap? If I use check_overlap = TRUE, then it removes some observations that overlap, and I don't want that. I also don't want the geom_label_repel, since it has the labels stick out and move across the 45 degree line I included (which I don't want to happen)

Here's the pertinent part of my code for reference:

ggplot(df, aes(x = huff_margin_dem, y = margin16dem_state, label = abbrev)) +
  geom_abline(intercept = 0) +
  geom_text(fontface = "bold")

Solution

  • Have you tried position=position_jitter()? You can adjust the width and height to your choosing.

    ggplot(df, aes(x = huff_margin_dem, y = margin16dem_state, label = abbrev)) +
      geom_abline(intercept = 0) +
      geom_text(fontface = "bold",position=position_jitter(width=1,height=1))
    

    EDIT An example to manipulate a certain label only

    +geom_text(fontface = "bold",
    position=position_jitter(width=ifelse(df$abbrev=='KS',1,0),
          height=ifelse(df$abbrev=='KS',1,0)))
    

    Or multiple labels

    df$jit<-with(df, ifelse(abbrev == "KS" | abbrev == "LA", 1, 2))
    
    +geom_text(fontface = "bold",
        position=position_jitter(width=df$jit,height=df$jit))