Skip to contents

Use this function to modify theme settings.

Usage

theme(..., complete = FALSE, validate = TRUE)

Arguments

...

a list of element name, element pairings that modify the existing theme.

complete

set this to TRUE if this is a complete theme, such as the one returned by theme_grey(). Complete themes behave differently when added to a ggplot object.

validate

TRUE to run validate_element, FALSE to bypass checks.

Details

Theme elements can inherit properties from other theme elements. For example, axis.title.x inherits from axis.title, which in turn inherits from text. All text elements inherit directly or indirectly from text; all lines inherit from line, and all rectangular objects inherit from rect.

For more examples of modifying properties using inheritance, %+replace%.

To see a graphical representation of the inheritance tree, see the last example below.

Theme elements

The individual theme elements are:

lineall line elements (element_line)
rectall rectangular elements (element_rect)
textall text elements (element_text)
titleall title elements: plot, axes, legends (element_text; inherits from text)
aspect.ratioaspect ratio of the panel
axis.titlelabel of axes (element_text; inherits from text)
axis.title.xx axis label (element_text; inherits from axis.title)
axis.title.yy axis label (element_text; inherits from axis.title)
axis.texttick labels along axes (element_text; inherits from text)
axis.text.xx axis tick labels (element_text; inherits from axis.text)
axis.text.yy axis tick labels (element_text; inherits from axis.text)
axis.tickstick marks along axes (element_line; inherits from line)
axis.ticks.xx axis tick marks (element_line; inherits from axis.ticks)
axis.ticks.yy axis tick marks (element_line; inherits from axis.ticks)
axis.ticks.lengthlength of tick marks (unit)
axis.linelines along axes (element_line; inherits from line)
axis.line.xline along x axis (element_line; inherits from axis.line)
axis.line.yline along y axis (element_line; inherits from axis.line)
legend.backgroundbackground of legend (element_rect; inherits from rect)
legend.marginextra space added around legend (unit)
legend.keybackground underneath legend keys (element_rect; inherits from rect)
legend.key.sizesize of legend keys (unit; inherits from legend.key.size)
legend.key.heightkey background height (unit; inherits from legend.key.size)
legend.key.widthkey background width (unit; inherits from legend.key.size)
legend.textlegend item labels (element_text; inherits from text)
legend.text.alignalignment of legend labels (number from 0 (left) to 1 (right))
legend.titletitle of legend (element_text; inherits from title)
legend.title.alignalignment of legend title (number from 0 (left) to 1 (right))
legend.positionthe position of legends ("none", "left", "right", "bottom", "top", or two-element numeric vector)
legend.directionlayout of items in legends ("horizontal" or "vertical")
legend.justificationanchor point for positioning legend inside plot ("center" or two-element numeric vector)
legend.boxarrangement of multiple legends ("horizontal" or "vertical")
legend.box.justjustification of each legend within the overall bounding box, when there are multiple legends ("top", "bottom", "left", or "right")
panel.backgroundbackground of plotting area, drawn underneath plot (element_rect; inherits from rect)
panel.borderborder around plotting area, drawn on top of plot so that it covers tick marks and grid lines. This should be used with fill=NA (element_rect; inherits from rect)
panel.marginmargin around facet panels (unit)
panel.margin.xhorizontal margin around facet panels (unit; inherits from panel.margin)
panel.margin.yvertical margin around facet panels (unit; inherits from panel.margin)
panel.gridgrid lines (element_line; inherits from line)
panel.grid.majormajor grid lines (element_line; inherits from panel.grid)
panel.grid.minorminor grid lines (element_line; inherits from panel.grid)
panel.grid.major.xvertical major grid lines (element_line; inherits from panel.grid.major)
panel.grid.major.yhorizontal major grid lines (element_line; inherits from panel.grid.major)
panel.grid.minor.xvertical minor grid lines (element_line; inherits from panel.grid.minor)
panel.grid.minor.yhorizontal minor grid lines (element_line; inherits from panel.grid.minor)
panel.ontopoption to place the panel (background, gridlines) over the data layers. Usually used with a transparent or blank panel.background. (logical)
plot.backgroundbackground of the entire plot (element_rect; inherits from rect)
plot.titleplot title (text appearance) (element_text; inherits from title) left-aligned by default
plot.subtitleplot subtitle (text appearance) (element_text; inherits from title) left-aligned by default
plot.captioncaption below the plot (text appearance) (element_text; inherits from title) right-aligned by default
plot.marginmargin around entire plot (unit with the sizes of the top, right, bottom, and left margins)
strip.backgroundbackground of facet labels (element_rect; inherits from rect)
strip.textfacet labels (element_text; inherits from text)
strip.text.xfacet labels along horizontal direction (element_text; inherits from strip.text)
strip.text.yfacet labels along vertical direction (element_text; inherits from strip.text)
strip.switch.pad.gridspace between strips and axes when strips are switched (unit)
strip.switch.pad.wrapspace between strips and axes when strips are switched (unit)

Examples

# \donttest{
p <- ggplot(mtcars, aes(mpg, wt)) +
  geom_point()
p

p + theme(panel.background = element_rect(colour = "pink"))

p + theme_bw()


# Scatter plot of gas mileage by vehicle weight
p <- ggplot(mtcars, aes(wt, mpg)) +
  geom_point()
# Calculate slope and intercept of line of best fit
coef(lm(mpg ~ wt, data = mtcars))
#> (Intercept)          wt 
#>   37.285126   -5.344472 
p + geom_abline(intercept = 37, slope = -5)

# Calculate correlation coefficient
with(mtcars, cor(wt, mpg, use = "everything", method = "pearson"))
#> [1] -0.8676594
#annotate the plot
p + geom_abline(intercept = 37, slope = -5) +
geom_text(data = data.frame(), aes(4.5, 30, label = "Pearson-R = -.87"))


# Change the axis labels
# Original plot
p

p + labs(x = "Vehicle Weight", y = "Miles per Gallon")

# Or
p + labs(x = "Vehicle Weight", y = "Miles per Gallon")


# Change title appearance
p <- p + labs(title = "Vehicle Weight-Gas Mileage Relationship")
# Set title to twice the base font size
p + theme(plot.title = element_text(size = rel(2)))

p + theme(plot.title = element_text(size = rel(2), colour = "blue"))


# Add a subtitle and adjust bottom margin
p + labs(title = "Vehicle Weight-Gas Mileage Relationship",
         subtitle = "You need to wrap long subtitleson manually") +
    theme(plot.subtitle = element_text(margin = margin(b = 20)))


# Changing plot look with themes
DF <- data.frame(x = rnorm(400))
m <- ggplot(DF, aes(x = x)) +
  geom_histogram()
# Default is theme_grey()
m
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

# Compare with
m + theme_bw()
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.


# Manipulate Axis Attributes
m + theme(axis.line = element_line(size = 3, colour = "red", linetype = "dotted"))
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

m + theme(axis.text = element_text(colour = "blue"))
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

m + theme(axis.text.y = element_blank())
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

m + theme(axis.ticks = element_line(size = 2))
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

m + theme(axis.title.y = element_text(size = rel(1.5), angle = 90))
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

m + theme(axis.title.x = element_blank())
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

m + theme(axis.ticks.length = unit(.85, "cm"))
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.


# Legend Attributes
z <- ggplot(mtcars, aes(wt, mpg)) +
  geom_point(aes(colour = factor(cyl)))
z

z + theme(legend.position = "none")

z + theme(legend.position = "bottom")

# Or use relative coordinates between 0 and 1
z + theme(legend.position = c(.5, .5))

# Add a border to the whole legend
z + theme(legend.background = element_rect(colour = "black"))

# Legend margin controls extra space around outside of legend:
z + theme(legend.background = element_rect(),
          legend.margin = unit(1, "cm"))

z + theme(legend.background = element_rect(),
          legend.margin = unit(0, "cm"))

# Or to just the keys
z + theme(legend.key = element_rect(colour = "black"))

z + theme(legend.key = element_rect(fill = "yellow"))

z + theme(legend.key.size = unit(2.5, "cm"))

z + theme(legend.text = element_text(size = 20, colour = "red", angle = 45))

z + theme(legend.title = element_text(face = "italic"))


# To change the title of the legend use the name argument
# in one of the scale options
z + scale_colour_brewer(name = "My Legend")

z + scale_colour_grey(name = "Number of \nCylinders")


# Panel and Plot Attributes
z + theme(panel.background = element_rect(fill = "black"))

z + theme(panel.border = element_rect(linetype = "dashed", colour = "black"))

z + theme(panel.grid.major = element_line(colour = "blue"))

z + theme(panel.grid.minor = element_line(colour = "red", linetype = "dotted"))

z + theme(panel.grid.major = element_line(size = 2))

z + theme(panel.grid.major.y = element_blank(),
          panel.grid.minor.y = element_blank())

z + theme(plot.background = element_rect())

z + theme(plot.background = element_rect(fill = "green"))


# Faceting Attributes
set.seed(4940)
dsmall <- diamonds[sample(nrow(diamonds), 1000), ]
k <- ggplot(dsmall, aes(carat, ..density..)) +
  geom_histogram(binwidth = 0.2) +
  facet_grid(. ~ cut)
k + theme(strip.background = element_rect(colour = "purple", fill = "pink",
                                          size = 3, linetype = "dashed"))

k + theme(strip.text.x = element_text(colour = "red", angle = 45, size = 10,
                                      hjust = 0.5, vjust = 0.5))

k + theme(panel.margin = unit(5, "lines"))

k + theme(panel.margin.y = unit(0, "lines"))


# Put gridlines on top
meanprice <- tapply(diamonds$price, diamonds$cut, mean)
cut <- factor(levels(diamonds$cut), levels = levels(diamonds$cut))
df <- data.frame(meanprice, cut)
g <- ggplot(df, aes(cut, meanprice)) + geom_bar(stat = "identity")
g + geom_bar(stat = "identity") +
    theme(panel.background = element_blank(),
          panel.grid.major.x = element_blank(),
          panel.grid.minor.x = element_blank(),
          panel.grid.minor.y = element_blank(),
          panel.ontop = TRUE)


# Modify a theme and save it
mytheme <- theme_grey() + theme(plot.title = element_text(colour = "red"))
p + mytheme


# }