- CATALOG -
Zhenguo Zhang's Blog
Sharing makes life better
[R] tidy evaluation in ggplot2

Since ggplot2 version 3.0.0, it started to support tidy evaluation, and use the technique to replace aes_ and aes_string(). In this post, I would like to show how the syntax of ggplot2 changes accordingly.

knitr::opts_chunk$set(echo=T, fig.align = "center", fig.width = 6, fig.height = 5, dpi=150, warning=FALSE)
library(knitr)
library(ggplot2)

Let’s start with an example of making a scatter plot with the dataset mtcars.

library(ggplot2)
plt<-ggplot(mtcars, aes(x=wt, y=mpg, color=factor(cyl))) + theme_bw()
plt<-plt+geom_point()
plt

But what if we create a function to make the plot and accept different variables for the color aesthetics?

make_scatter_plot<-function(colorVar) {
  plt<-ggplot(mtcars, aes(x=wt, y=mpg, color=factor(colorVar))) + theme_bw()
  plt<-plt+geom_point()
  plt
}
make_scatter_plot("cyl")

As you can see, this doesn’t work as expected: it actually created a new variable which has only one value “cyl” for the fill aesthetics. What we need is to use the cyl column of the mtcars dataset to fill the colors.

Here is tidy evaluation kicks in: we use enquo() to quote an input variable, and then unquote it with !!, as shown in the function below:

make_scatter_plot<-function(colorVar) {
  colorVar<-enquo(colorVar)
  plt<-ggplot(mtcars, aes(x=wt, y=mpg, color=factor(!!colorVar))) + theme_bw()
  plt<-plt+geom_point()
  plt
}
make_scatter_plot(cyl)

Here we used the function ggplot2::enquo() which delayed the evaluation of an expression, and it will only be evaluated when prefixed with !!. This is the key feature of tidy evaluation. With this function, we can call a different column to color it, for example:

make_scatter_plot(gear)

Note that you can’t put the variable name in a quote, such as “gear”, and it would not work.

Another useful function is ggplot2::vars(), it can quasiquote more than one variables and be used in functions such as facet_wrap() and facet_grid(). Let’s see an example:

make_scatter_plot(gear) + facet_wrap(vars(am), labeller=label_both)

We can also put both color and facet variable in another function make_scatter_plot_facet which calls make_scatter_plot. As you can see, the color variable need be enquo and unquote (use !!) in this wrapping function too.

make_scatter_plot_facet<-function(colorVar, facetVar) {
  #facetName<-quo_name(facetVar)
  facetVar<-enquo(facetVar)
  colorVar<-enquo(colorVar)
  make_scatter_plot(!!colorVar) + facet_wrap(vars(!!facetVar), labeller=label_both)
}

make_scatter_plot_facet(gear, am)

This is just the first post on tidy evaluation. More is coming.

Happy programming 😄


Last modified on 2023-10-23

Comments powered by Disqus