Tweaking figures for presentations or publications can be a tedious
process, especially when I always need a reminder on “how to use greek
letters or subscripts in y-axis”, “remove legend”, and “r pch”. Here are
a collection of some
ggplot2 functions and arguments that I find
particularly useful and want to remember.
ylab() function, use
use special characters. Use brackets (
) for subscript, the caret
^) for superscript, and the names of greek letters e.g.
ylab(expression(paste("C", H, " (", mu,"mol ", L^-1,")"))) + xlab(expression(paste("DOC (mg ", L^-1,")")))
theme(axis.text.x = element_text(angle = 90, hjust = 1))
scale_y_continuous(labels = scales::percent). To round the percentages to the nearest whole number, use
scale_y_continuous(labels = scales::percent_format(accuracy = 1)).
scale_shape_manual()with arguments values and labels:
scale_shape_manual(values = c(21, 24), name = element_blank(), labels = c("Landsat", "Sentinel2"))
As described in detail on the Cookbook for
website, vertically oriented error bars can be added to a plot using
geom_errorbar(). The necessary aesthetics are
and usually I adjust the
width to 0.1 or 0.2. Use
xmax for horizontal error bars
(or rotate the whole plot with
Smooth out density plot using the
adjust argument in
Zoom in without losing outlier data points using
Alternatively, lose the outliers on a boxplot with
geom_boxplot(outlier.shape = NA)
annotate()function. You will need to include
parse = TRUEas an argument so that the string is converted to a plotmath expression.
set.seed(222) mydata <- data.frame(x = 1:10, y = 1:10 + rnorm(10, sd = 2)) fit <- lm(y ~ x, data = mydata) rsq_label <- paste('R^2 == ', round(summary(fit)$r.squared, 2)) ggplot(mydata, aes(x = x, y = y)) + geom_point(size = 2) + geom_smooth(method = 'lm', se = FALSE, size = 1.5) + annotate(geom = 'text', x = -Inf, y = Inf, label = rsq_label, hjust = 0, vjust = 1, parse = TRUE) ## `geom_smooth()` using formula 'y ~ x'
To put text labels exactly in the corner or on the edge of the plot
area, you can use
-Inf as coordinate values. This is also
illustrated in the example above. Note that you have to change the
vjust arguments as well.
If you have a faceted plot there are a lot of ways to customize the
labels that appear along the facet margins. To use expressions in
the facet labels you can use
label_parsed. Notice that you have to
format the labels as expressions, which includes replacing spaces
mydata <- data.frame(y = 1:10, variable = c('Flux~(g~m^-2~s^-1)', 'Mass~(g)')) ggplot(mydata, aes(y = y)) + geom_boxplot() + facet_wrap(~ variable, labeller = label_parsed)
The basic idea is to initiate an empty drawing canvas with the
ggdraw() function, and then determined the location and sizing of each
If you have 4 ggplot objects called panel_a, panel_b, panel_c, and panel_d, creating a 4-panel figure with labels would look something like this:
figure <- ggdraw() + draw_plot(panel_a, x = 0, y = .5, width = 0.4, height = 0.5) + draw_plot(panel_b, x = .4, y = .5, width = 0.6, height = 0.5) + draw_plot(panel_c, x = 0, y = 0, width = 0.4, height = 0.5) + draw_plot(panel_d, x = .4, y = 0, width = 0.6, height = 0.5) + draw_plot_label(label = c("a", "b", "c", "d"), x = c(0, 0.4, 0, 0.4), y = c(1,1, 0.5, 0.5), size = 15)
The arguments for the draw_plot function are:
There is also a handy function for saving this type of plot to a file:
save_plot("figure.png", figure, ncol = 2, nrow = 2, base_aspect_ratio = 1.3)
As I haven’t determined anything particulary bovine-related in the package, I’m pretty sure the name references the author’s initials.
The best one I have found is written by Jon Lefcheck and can be sourced directly from GitHub:
source('https://gist.githubusercontent.com/jslefche/eff85ef06b4705e6efbc/raw/736d3dc9fe71863ea62964d9132fded5e3144ad7/theme_black.R') mydata <- data.frame(x=runif(100), y=runif(100), gp=letters[1:5]) ggplot(mydata,aes(x = x,y = y, color = gp)) + geom_line() + theme_black()