September 25, 2019 by Kelly Hondula , Quentin Read
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.
Within an xlab()
or ylab()
function, use expression(paste())
to
use special characters. Use brackets ([]
) for subscript, the caret
(^
) for superscript, and the names of greek letters e.g. mu
.
ylab(expression(paste("C", H[4], " (", mu,"mol ", L^-1,")"))) +
xlab(expression(paste("DOC (mg ", L^-1,")")))
scale_x_date()
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
R
website, vertically oriented error bars can be added to a plot using
geom_errorbar()
. The necessary aesthetics are ymin
and ymax
,
and usually I adjust the width
to 0.1 or 0.2. Use
geom_errorbarh()
with xmin
and xmax
for horizontal error bars
(or rotate the whole plot with coord_flip()
).
Smooth out density plot using the adjust
argument in
geom_density
Zoom in without losing outlier data points using coord_cartesian()
Alternatively, lose the outliers on a boxplot with
geom_boxplot(outlier.shape = NA)
annotate()
function. You will need to include
parse = TRUE
as 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)
To put text labels exactly in the corner or on the edge of the plot
area, you can use Inf
or -Inf
as coordinate values. This is also
illustrated in the example above. Note that you have to change the
hjust
and 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
with ~
.
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
panel with draw_plot()
functions.
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()