ggrepel examples

Kamil Slowikowski

2020-03-07

Overview

ggrepel provides geoms for ggplot2 to repel overlapping text labels:

  • geom_text_repel()
  • geom_label_repel()

Text labels repel away from each other, away from data points, and away from edges of the plotting area.

Let’s compare geom_text() and geom_text_repel():

Options

Options available for geom_text() and geom_label() are also available for geom_text_repel() and geom_label_repel(), including size, angle, family, fontface, etc.

ggrepel provides additional options for geom_text_repel and geom_label_repel:

Option Default Description
force 1 force of repulsion between overlapping text labels
direction "both" move text labels “both” (default), “x”, or “y” directions
max.iter 2000 maximum number of iterations to try to resolve overlaps
nudge_x 0 adjust the starting x position of the text label
nudge_y 0 adjust the starting y position of the text label
box.padding 0.25 lines padding around the text label
point.padding 0 lines padding around the labeled data point
segment.color "black" line segment color
segment.size 0.5 mm line segment thickness
segment.alpha 1.0 line segment transparency
arrow NULL render line segment as an arrow with grid::arrow()

Examples

Do not repel labels from data points

Set point.padding = NA to prevent label repulsion away from data points.

Now labels move away from each other and away from the edges of the plot.

Limit labels to a specific area

Use options xlim and ylim to constrain the labels to a specific area. Limits are specified in data coordinates. Use NA when there is no lower or upper bound in a particular direction.

Here we also use grid::arrow() to render the segments as arrows.

Align labels on the top or bottom edge

Use hjust or vjust to justify the text neatly:

  • hjust = 0 for left-align
  • hjust = 0.5 for center
  • hjust = 1 for right-align

Sometimes the labels do not align perfectly. Try using direction = "x" to limit label movement to the x-axis (left and right) or direction = "y" to limit movement to the y-axis (up and down). The default is direction = "both".

Also try using xlim() and ylim() to increase the size of the plotting area so all of the labels fit comfortably.

Align text vertically with nudge_y and allow the labels to move horizontally with direction = "x":

Align labels on the left or right edge

Set direction to “y” and try hjust 0.5, 0, and 1:

Align text horizontally with nudge_x and hjust, and allow the labels to move vertically with direction = "y":

Source code

View the source code for this vignette on GitHub.

R Session Info

## R version 3.6.1 (2019-07-05)
## Platform: x86_64-apple-darwin15.6.0 (64-bit)
## Running under: macOS Catalina 10.15.3
## 
## Matrix products: default
## BLAS:   /Users/kamil/miniconda3/lib/libmkl_rt.dylib
## LAPACK: /Library/Frameworks/R.framework/Versions/3.6/Resources/lib/libRlapack.0.dylib
## 
## locale:
## [1] C/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] ggrepel_0.8.2 ggplot2_3.2.1 gridExtra_2.3 knitr_1.27   
## 
## loaded via a namespace (and not attached):
##  [1] Rcpp_1.0.3       pillar_1.4.3     compiler_3.6.1   prettydoc_0.3.1 
##  [5] tools_3.6.1      digest_0.6.25    evaluate_0.14    lifecycle_0.1.0 
##  [9] tibble_2.1.3     gtable_0.3.0     pkgconfig_2.0.3  rlang_0.4.5     
## [13] yaml_2.2.0       xfun_0.12        withr_2.1.2      stringr_1.4.0   
## [17] dplyr_0.8.4      grid_3.6.1       tidyselect_1.0.0 glue_1.3.1      
## [21] R6_2.4.1         rmarkdown_2.0    purrr_0.3.3      farver_2.0.3    
## [25] magrittr_1.5     scales_1.1.0     codetools_0.2-16 htmltools_0.4.0 
## [29] assertthat_0.2.1 colorspace_1.4-1 labeling_0.3     stringi_1.4.6   
## [33] lazyeval_0.2.2   munsell_0.5.0    crayon_1.3.4