The legend

Sometimes we want to adapt the legend a bit. Here we’ll see some popular options:

Removing the legend

ggplot(mpg, aes(x = hwy, y = cty, colour = drv)) + geom_point() +
  guides(colour = "none")

Changing location of legend

ggplot(mpg, aes(x = hwy, y = cty, colour = drv)) + geom_point() +
  theme(legend.position = "top") # options: top, left, right, bottom

You can also specify a position with two numbers between 0 and 1. The first number means the position on the x-axis, 0 means all the way at the start of the x-axis (i.e., to the left), 0.5 means halfway, and 1 means all the way at the end of the x-axis. The second number does the same for the y-axis, where 0 is the lowest value of the y-axis, and 1 the highest. Setting the legend to c(0.5, 0.5) means that the legend will be placed right in the middle (with the center of the legend exactly on the middle point of the graph!):

ggplot(mpg, aes(x = hwy, y = cty, colour = drv)) + geom_point() +
  theme(legend.position = c(0.5, 0.5))
## Warning: A numeric `legend.position` argument in `theme()` was deprecated in ggplot2
## 3.5.0.
## ℹ Please use the `legend.position.inside` argument of `theme()` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Another option:

ggplot(mpg, aes(x = hwy, y = cty, colour = drv)) + geom_point() +
  theme(legend.position = c(0.1, 0.8))

We’ve seen we can change the position of the legend by using the legend.position function. Often it is helpful to also use legend.justification. For instance, let’s try and place the legend in the right bottom corner:

ggplot(mpg, aes(x = hwy, y = cty, colour = drv)) + geom_point() +
  theme(legend.position = c(1, 0))

Why does this happen?

The centre of the legend is placed on the designated location. We can change this by using the legend.justification. Again we specify two numbers. One number specifies what should happen with the boundaries of the legend in the horizontal dimension; a 0 indicates that the left boundary will be set at the x-position specified (the legend will be shifted to the rightt), a 1 means that the right boundary will be set at the x-position specified (the legend will be shifted to the left). The second number does the same for the vertical dimension, where a 0 shifts the legend upwards, and a 1 downwards.

ggplot(mpg, aes(x = hwy, y = cty, colour = drv)) + geom_point() +
  theme(legend.position = c(1, 0), legend.justification = c(1, 0))

Play around with the legend.position and legend.justification; do you see the pattern?

Changing order in legend

You’ll find you often need this, so it is important to see how to do this:

ggplot(mpg, aes(x = hwy, y = cty, colour = drv)) + geom_point() +
  scale_colour_discrete(limits = c("f", "r", "4"))

Changing features of legend

We can also change some features of the legend itself:

ggplot(mpg, aes(x = hwy, y = cty, colour = drv)) + geom_point() +
  labs(colour = "Drive") +
  theme(
    legend.position = c(0.1, 0.8),
    legend.background = element_blank(),
    legend.key = element_blank(),
    legend.title = element_text(family = "serif", face = "italic"),
    legend.title.align = 0.5,
    legend.text = element_text(face = "bold.italic", size = 10)
  )
## Warning: The `legend.title.align` argument of `theme()` is deprecated as of ggplot2
## 3.5.0.
## ℹ Please use theme(legend.title = element_text(hjust)) instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.