Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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") 
like image 431
Alexander Agadjanian Avatar asked Nov 11 '16 06:11

Alexander Agadjanian


2 Answers

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)) 
like image 176
J.Con Avatar answered Sep 21 '22 05:09

J.Con


Just thought I'd point out that ggrepel::geom_text_repel will do what you're after. Considering some of the text in your example already overlaps with the line, I figure perhaps it is the label part of geom_label_repel that you don't like, due to the background it will place behind your text, blocking the line.

Using your example:

ggplot(df) +   geom_text_repel(aes(x = huff_margin_dem,                        y = margin16dem_state,                        label = abbrev)) 
like image 42
conor Avatar answered Sep 22 '22 05:09

conor