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:
hjust
vjust
nudge_x
nudge_y
position
check_overlap
ggrepel
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