35 Vis: Themes

Purpose: Themes are key for aesthetic purposes; to make really good-looking graphs, we’ll need to use theme().

Reading: theme() documentation (Use as a reference; don’t read the whole thing!)

35.0.1 q1 Use theme_void() and guides() (with an argument) to remove everything in this plot except the points.

mpg %>%
  ggplot(aes(displ, hwy, color = class)) +
  geom_point()

mpg %>%
  ggplot(aes(displ, hwy, color = class)) +
  geom_point() +
  guides(color = "none") +
  theme_void()

When I make presentation-quality figures, I often start with the following stub code:

## NOTE: No need to edit; feel free to re-use this code!
theme_common <- function() {
  theme_minimal() %+replace%
  theme(
    axis.text.x = element_text(size = 12),
    axis.text.y = element_text(size = 12),
    axis.title.x = element_text(margin = margin(4, 4, 4, 4), size = 16),
    axis.title.y = element_text(margin = margin(4, 4, 4, 4), size = 16, angle = 90),

    legend.title = element_text(size = 16),
    legend.text = element_text(size = 12),

    strip.text.x = element_text(size = 12),
    strip.text.y = element_text(size = 12),

    panel.grid.major = element_line(color = "grey90"),
    panel.grid.minor = element_line(color = "grey90"),

    aspect.ratio = 4 / 4,

    plot.margin = unit(c(t = +0, b = +0, r = +0, l = +0), "cm"),
    plot.title = element_text(size = 18),
    plot.title.position = "plot",
    plot.subtitle = element_text(size = 16),
    plot.caption = element_text(size = 12)
  )
}

The %+replace magic above allows you to use theme_common() within your own ggplot calls.

35.0.2 q2 Use theme_common() with the following graph. Document what’s changed by the theme() arguments.

mpg %>%
  ggplot(aes(displ, hwy, color = class)) +
  geom_point() +
  labs(
    x = "Engine Displacement (L)",
    y = "Highway Fuel Economy (mpg)"
  )

mpg %>%
  ggplot(aes(displ, hwy, color = class)) +
  geom_point() +
  theme_common() +
  labs(
    x = "Engine Displacement (L)",
    y = "Highway Fuel Economy (mpg)"
  )

Observations:

  • The text is larger, hence more readable
  • The background was flipped grey to white
  • The guide lines have been flipped from white to grey

Calling theme_common(), along with settings labs() and making some smart choices about geoms and annotations is often all you need to make a really high-quality graph.

35.0.3 q3 Make the following plot as ugly as possible; the more theme() arguments you use, the better!

Hint: Use the theme() settings from q2 above as a starting point, and read the documentation for theme() to learn how to do more horrible things to this graph.

mpg %>%
  ggplot(aes(displ, hwy, color = class)) +
  geom_point() +
  theme(
    axis.text.x = element_text(size = 32)
  )

Here’s one possible graph:

mpg %>%
  ggplot(aes(displ, hwy, color = class)) +
  geom_point() +
  guides(color = "none") +
  theme(
    line = element_line(size = 3, color = "purple"),
    rect = element_rect(fill = "red"),
    axis.text.x = element_text(size = 32, angle = 117),
    axis.text.y = element_text(size = 32, angle = 129),
    axis.title.x = element_text(size = 32, family = "Comic Sans MS"),
    axis.title.y = element_text(size = 32, family = "Comic Sans MS")
  )
## Warning: The `size` argument of `element_line()` is deprecated as of ggplot2 3.4.0.
## ℹ Please use the `linewidth` argument instead.