Some text labels overlap each other in plots created with geom_text:
library(ggplot2)
ggplot(mtcars) +
geom_point(aes(wt, mpg), color = 'red') +
geom_text(aes(wt, mpg, label = rownames(mtcars))) +
theme_classic(base_size = 16)
ggrepel implements functions to repel overlapping text labels away from each other and away from the data points that they label. The algorithm works as follows:
We can repel the text labels away from each other by loading ggrepel and using geom_text_repel instead:
library(ggrepel)
set.seed(42)
ggplot(mtcars) +
geom_point(aes(wt, mpg), color = 'red') +
geom_text_repel(aes(wt, mpg, label = rownames(mtcars))) +
theme_classic(base_size = 16)
All options available for geom_text such as size and fontface are also available for geom_text_repel.
However, the following parameters are not supported:
hjustvjustnudge_xnudge_ypositioncheck_overlapggrepel provides additional parameters for geom_text_repel and geom_label_repel:
segment.color is the line segment colorbox.padding is the padding surrounding the text bounding boxpoint.padding is the padding around the labeled pointforce is the force of repulsion between overlapping text labelsmax.iter is the maximum number of iterations to attempt to resolve overlapsset.seed(42)
ggplot(mtcars) +
geom_point(aes(wt, mpg), color = 'red') +
geom_text_repel(
aes(
wt, mpg,
color = factor(cyl),
label = rownames(mtcars)
),
size = 5,
fontface = 'bold',
segment.color = 'red',
box.padding = unit(0.3, 'lines'),
point.padding = unit(0.4, 'lines'),
force = 2,
max.iter = 1e4
) +
scale_color_discrete(name = 'cyl') +
theme_classic(base_size = 16)
geom_label_repel is based on geom_label.
set.seed(42)
ggplot(mtcars) +
geom_point(aes(wt, mpg)) +
geom_label_repel(
aes(wt, mpg, fill = factor(cyl), label = rownames(mtcars)),
fontface = 'bold', color = 'white',
box.padding = unit(0.25, "lines")
) +
theme_classic(base_size = 16)
# Read Stephen Turner's data
genes <- read.table("genes.txt.bz2", header = TRUE)
genes$Significant <- ifelse(genes$padj < 0.05, "FDR < 0.05", "Not Sig")
ggplot(genes, aes(x = log2FoldChange, y = -log10(pvalue))) +
geom_point(aes(color = Significant)) +
scale_color_manual(values = c("red", "grey")) +
theme_bw(base_size = 16) +
geom_text_repel(
data = subset(genes, padj < 0.05),
aes(label = Gene),
size = 5,
box.padding = unit(0.35, "lines"),
point.padding = unit(0.3, "lines")
)
# This chunk of code will take a minute or two to run.
library(ggrepel)
library(animation)
plot_frame <- function(n) {
set.seed(42)
p <- ggplot(mtcars) +
geom_point(aes(wt, mpg), color = 'red') +
geom_text_repel(
aes(wt, mpg, label = rownames(mtcars)),
size = 5, force = 3, max.iter = n
) +
theme_classic(base_size = 16)
print(p)
}
saveGIF(
lapply(c(seq(0, 2000, 25)), function(i) {
plot_frame(i)
}),
interval = 0.05,
ani.width = 800,
ani.heigth = 600,
movie.name = 'animated.gif'
)
sessionInfo()
## R version 3.2.3 (2015-12-10)
## Platform: x86_64-apple-darwin13.4.0 (64-bit)
## Running under: OS X 10.10.5 (Yosemite)
##
## locale:
## [1] en_US.UTF-8/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.4 ggplot2_2.0.0 knitr_1.12
##
## loaded via a namespace (and not attached):
## [1] Rcpp_0.12.3 codetools_0.2-14 digest_0.6.9 grid_3.2.3
## [5] plyr_1.8.3 gtable_0.1.2 formatR_1.2.1 magrittr_1.5
## [9] evaluate_0.8 scales_0.3.0 stringi_1.0-1 labeling_0.3
## [13] tools_3.2.3 stringr_1.0.0 munsell_0.4.2 colorspace_1.2-6