10.2 Changing the Position of a Legend
10.2.2 Solution
Use theme(legend.position = ...)
. It can be put on the top, left, right, or bottom by using one of those strings as the position (Figure 10.2, left).
pg_plot <- ggplot(PlantGrowth, aes(x = group, y = weight, fill = group)) +
geom_boxplot() +
scale_fill_brewer(palette = "Pastel2")
pg_plot +
theme(legend.position = "top")
The legend can also be placed inside the plotting area by specifying a coordinate position, as in legend.position = c(.8, .3)
(Figure 10.2, right). The coordinate space starts at (0, 0) in the bottom left and goes to (1, 1) in the top right.


Figure 10.2: Legend on top (left); Legend inside of plotting area (right)
10.2.3 Discussion
You can also use legend.justification
to set which part of the legend box is set to the position at legend.position
. By default, the center of the legend (.5, .5) is placed at the coordinate, but it is often useful to specify a different point.
For example, this will place the bottom-right corner of the legend (1, 0) in the bottom-right corner of the plotting area (1, 0) (Figure 10.3, left):
And this will place the top-right corner of the legend in the top-right corner of the graphing area (Figure 10.3, right):


Figure 10.3: Legend in bottom-right corner (left); Legend in top-right corner (right)
When placing the legend inside of the graphing area, it may be helpful to add an opaque border to set it apart (Figure 10.4, left):
pg_plot +
theme(legend.position = c(.85, .2)) +
theme(legend.background = element_rect(fill = "white", colour = "black"))
You can also remove the border around its elements so that it blends in (Figure 10.4, right):
pg_plot +
theme(legend.position = c(.85, .2)) +
theme(legend.background = element_blank()) + # Remove overall border
theme(legend.key = element_blank()) # Remove border around each item


Figure 10.4: Legend with opaque background and outline (left); With no background or outlines (right)