Theming
Last updated on 2025-04-15 | Edit this page
Estimated time: 15 minutes
Overview
Questions
- “How can I make the plot look good?”
- “How do I get rid of that grey background?”
- “How do I get rid of the gridlines?”
Objectives
- “Learn to use different themes”
- “Learn to adjust the appearance of specific parts of the plot”
The THEME_FUNCTIONs
Every part of the plot can be changed. The grey background might be annoying The gridlines might be confusing.
These non-data components of the plots can be controlled using the
family of theme
functions:
R
ggplot(diamonds, aes(carat, price)) +
geom_point() +
theme_bw()
More exists:
ERROR
Error in default | bw: operations are possible only for numeric, logical or complex types
Notice the pattern?
A general pattern of function names in ggplot2 can be seen.
Themes are named “theme_” and then the name of the theme. We saw the same pattern with the scale functions: “scale_” and then the axis, followed by what we did to the axis, eg: “scale_y_log10”
Even more theming
Every element in the plot can be controlled. The
theme()
function is the way to do that:
R
diamonds %>%
ggplot(aes(carat, price)) +
geom_point() +
theme_dark() +
theme(axis.text.y = element_text(angle= 45))

Angling the labels in a plot can be good for readability. However the actual way to do it can be a bit more involved as you see above. Read the help for theme to get at complete list of things that can be changed. There are 97 things in total.
Also note, that we can add theming on top of previous theming. Here we begin with a built-in theme that we like, and change the parts we want to change.
Finally note, that the order is important:
R
diamonds %>%
ggplot(aes(carat, price)) +
geom_point() +
theme_dark() +
theme(axis.text.y = element_text(angle= 45))
and
R
diamonds %>%
ggplot(aes(carat, price)) +
geom_point() +
theme(axis.text.y = element_text(angle= 45)) +
theme_dark()
Will not give the same result. theme_dark
has a setting
for the way the text on the y-axis is shown, and will overwrite the
changes done before calling it.
Most of the elements
of the plot need to be defined in a
special way. If we want the “theme” a text element, we set the
axis.text
to be an element_text()
function
with specific arguments to specify what we want to do. For the
background of the plot we are changing a rectangular object
element_rect
, and can set the background colour like
this:
R
diamonds %>%
ggplot(aes(carat, price)) +
geom_point() +
theme(axis.text.y = element_text(angle= 45),
panel.background = element_rect(fill = "red"))
Note that we are not setting the
plot.background
, as that
would change the background of the entire plot, rather than the
background of the actual area on which we are plotting.
Key Points
- “EVERYTHING in the plot can be customized”