This R graphics tutorial shows how to customize a ggplot legend.
you will learn how to:
- Change the legend title and text labels
- Modify the legend position. In the default setting of ggplot2, the legend is placed on the right of the plot. We’ll show examples of how to move the legend to the bottom or to the top side of the plot. You’ll will also learn how to put the legend inside the plot.
- Reverse legend order. The easy way to reverse the order of legend items is to use the ggplot2 legend guides() function. It change the legend order for the specified aesthetic (fill, color, linetype, shape, size, etc). Example of R code:
p + guides(fill = guide_legend(reverse = TRUE))
for color of area fills (e.g.: box plot and bar graph) orp + guides(color = guide_legend(reverse = TRUE))
for point and line color (e.g.: scatter plot and line plot). - Remove a ggplot legend
- Remove the legend title:
p + theme(legend.title = element_blank())
. - Hide the entire legend to create a ggplot with no legend. Example of R code:
p + theme(legend.position = "none")
. - Hide legend for a specific geometry, say
geom_text()
. Just specify the argumentshow.legend = FALSE
in the given geometry. Example:geom_text(show.legend = FALSE)
.
- Remove the legend title:
- Change the legend theme
- Modify the font appearance (size, color / colour and face) of the legend title and text labels.
- Modify the legend background color, key size and key width.
- Rename legend labels and change the order of items in a given legend.
- Control the legend colors manually by specifying custom color values.
- Set ggplot legend guides for each aesthetic when you have many legends. R function: guides()
- Change the legend order in the situation where you have multiple legends (or multiple guides) generated by using multiple aesthetics (shape, color, size, fill, etc) in the plot. For example, you might have one legend for point shape and another for point color and size.
- Remove the legend for a specific aesthetic, say the legend for shape.
Contents:
- Key ggplot2 R functions
- Change legend title
- Change legend position
- Reverse the order of legend items
- Remove legend
- Change the legend font size, color and face
- Change legend background color, key size and width
- Rename legend labels and change the order of items
- Change legend colors manually
- Multiple guides: Remove and order legends
- Conclusion
Key ggplot2 R functions
Start by creating a box plot using the ToothGrowth
data set. Change the box plot fill color according to the grouping variable dose
.
library(ggplot2)
ToothGrowth$dose <- as.factor(ToothGrowth$dose)
p <- ggplot(ToothGrowth, aes(x = dose, y = len))+
geom_boxplot(aes(fill = dose)) # Change fill color by groups
Key R functions to change ggplot legends:
- p + labs(). Change legend title.
- Use p + labs(fill = “dose”) for geom_boxplot(aes(fill = dose))
- Use p + labs(color = “dose”) for geom_boxplot(aes(color = dose))
- and so on for linetype, shape, etc
- p + theme(…). Change legend theme: background color, legend box border, font size and color.
- p + scale_x_discrete(limits = c(“2”, “0.5”, “1”)). Change the order of the item in the legend.
- p + scale_fill_discrete(name = “Dose”, labels = c(“A”, “B”, “C”)). Rename the legend title and text labels.
- guides(). Change legend order and remove a specific legend of aesthetics, when you have multiple legends.
Essential ggplot2 theme options for legend:
theme(
# Legend title and text labels
#:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# Title font color size and face
legend.title = element_text(color, size, face),
# Title alignment. Number from 0 (left) to 1 (right)
legend.title.align = NULL,
# Text label font color size and face
legend.text = element_text(color, size, face),
# Text label alignment. Number from 0 (left) to 1 (right)
legend.text.align = NULL,
# Legend position, margin and background
#:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# Legend position: right, left, bottom, top, none
legend.position = "right",
# Margin around each legend
legend.margin = margin(0.2, 0.2, 0.2, 0.2, "cm"),
# Legend background
legend.background = element_rect(fill, color, size, linetype),
# Legend direction and justification
#:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# Layout of items in legends ("horizontal" or "vertical")
legend.direction = NULL,
# Positioning legend inside or outside plot
# ("center" or two-element numeric vector)
legend.justification = "center",
# Background underneath legend keys
#:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
legend.key = element_rect(fill, color), # Key background
legend.key.size = unit(1.2, "lines"), # key size (unit)
legend.key.height = NULL, # key height (unit)
legend.key.width = NULL, # key width (unit)
# Spacing between legends.
#:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
legend.spacing = unit(0.4, "cm"),
legend.spacing.x = NULL, # Horizontal spacing
legend.spacing.y = NULL, # Vertical spacing
# Legend box
#:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# Arrangement of multiple legends ("horizontal" or "vertical")
legend.box = NULL,
# Margins around the full legend area
legend.box.margin = margin(0, 0, 0, 0, "cm"),
# Background of legend area: element_rect()
legend.box.background = element_blank(),
# The spacing between the plotting area and the legend box
legend.box.spacing = unit(0.4, "cm")
)
To blank the legend title, use element_blank()
for the corresponding theme option. For example, use this: p + theme(legend.title = element_blank())
.
Change legend title
The function labs()
can be used to easily update the legend title for a given aesthetic (fill, color, size, shape, linetype, …):
# Default plot
print(p)
# Modify legend titles
p + labs(fill = "Dose (mg)")
Change legend position
Allowe values for the legend position is: “left”,“top”, “right”, “bottom”, “none”.
Legend loction can be also a numeric vector c(x,y), where x and y are the coordinates of the legend box. Their values should be between 0 and 1. c(0,0) corresponds to the “bottom left” and c(1,1) corresponds to the “top right” position. This makes it possible to place the legend inside the plot.
# Set legend position to top
p + theme(legend.position="top")
# Set legend position as numeric vector c(x, y)
# Place the legend inside the plot
p + theme(legend.position = c(0.7, 0.2),
legend.direction = "horizontal")
Reverse the order of legend items
To change the order of legend items in our example, where the box plot areas are filled by groups, you can use either the function guides() or scale_fill_discrete() as follow:
# Use guides function to reverse legend for
# a specific aesthetic (fill, linetype, shape or color)
p + guides(fill = guide_legend(reverse=TRUE))
# Or use scale_fill_discrete (same as above)
p + scale_fill_discrete(guide = guide_legend(reverse=TRUE))
# Or modify directly the scale (same as above)
p + scale_fill_discrete(breaks = rev(levels(ToothGrowth$dose)))
Remove legend
You can suppress the legend as follow:
p + theme(legend.position = "none")
Change the legend font size, color and face
The following R code changes legend size and text color:
# Change the appearance of legend title and text labels
p + theme(legend.title = element_text(color = "blue", size = 10),
legend.text = element_text(color = "red"))
Change legend background color, key size and width
p + theme(
# Change legend background color
legend.background = element_rect(fill = "darkgray"),
legend.key = element_rect(fill = "lightblue", color = NA),
# Change legend key size and key width
legend.key.size = unit(1.5, "cm"),
legend.key.width = unit(0.5,"cm")
)
To add a border to the legend box, you can specify the following arguments in the function element_rect()
:
linetype
, which values include one of: “solid”, “dashed”, …color
andsize
, to change the box border line color and size, respectively
For example:
p + theme(
legend.background = element_rect(color = "steelblue", linetype = "solid")
)
Rename legend labels and change the order of items
This can be done using the scale functions:
- Change the order of legend items:
scale_x_discrete()
- Edit legend title and text labels:
scale_fill_discrete()
# Change the order of legend items
p + scale_x_discrete(limits=c("2", "0.5", "1"))
# Edit legend title and labels
p + scale_fill_discrete(name = "Dose", labels = c("A", "B", "C"))
Other discrete scales include:
# Color of lines and points
scale_color_discrete(name, labels, limits, breaks)
# For linetypes
scale_linetype_discrete(name, labels, limits, breaks)
# For point shapes
scale_shape_discrete(name, labels, limits, breaks)
# For point size
scale_size_discrete(name, labels, limits, breaks)
# Opacity/transparency
scale_alpha_discrete(name, labels, limits, breaks)
Change legend colors manually
The functions below can be used to manually modify the color of the legend:
- scale_color_manual() or scale_colour_manual(): Modify the color of points and lines.
- scale_fill_manual(): Modify the color of area fills (for bar plot and box plot)
p + scale_fill_manual(values = c("#d8b365", "#f5f5f5", "#5ab4ac"))
Multiple guides: Remove and order legends
It’s possible to use the function guides()
to set or remove the legend of a particular aesthetic (fill, color, size, shape, etc).
- Data:
mtcars
. Convertcyl
andgear
to factor variables:
mtcars$cyl<-as.factor(mtcars$cyl)
mtcars$gear <- as.factor(mtcars$gear)
- Create a scatter plot with multiple aesthetics (guides). The color and the shape of the points are determined by the factor variables
cyl
andgear
, respectively. The size of the points are controlled by the variable qsec.
p <- ggplot(data = mtcars, aes(x = mpg, y = wt))+
geom_point(aes(color = cyl, size = qsec, shape = gear))
p
- Change legend position for multiple guides:
p + theme(legend.position = "bottom",
legend.box = "vertical")
- Change the order of legend using the function
guide_legend()
:
p + guides(color = guide_legend(order = 1),
size = guide_legend(order = 2),
shape = guide_legend(order = 3))
Note that, in the case of continuous color, the function guide_colourbar()
should be used to change the order of color guide.
ggplot(data = mpg, aes(x = displ, y = cty))+
geom_point(aes(size = hwy, color = cyl, shape = drv))+
guides(colour = guide_colourbar(order = 1),
alpha = guide_legend(order = 2),
size = guide_legend(order = 3))
- Remove a legend for a particular aesthetic (color and size):
p + guides(color = FALSE, size = FALSE)
Removing a particular legend can be also done when using the scale_xx()
functions. In this case the argument guide is used as follow.
# Turn off legend for the point shape
p + scale_shape(guide=FALSE)
# Turn off legend for size
p + scale_size(guide=FALSE)
# Turn off legend legend for color
p + scale_color_manual(values=c('#999999','#E69F00','#56B4E9'),
guide=FALSE)
Conclusion
We introduce how to easily change a ggplot legend title, position and labels. The different steps are summarized as follow.
- Create an example of ggplot:
library(ggplot2)
p <- ggplot(ToothGrowth, aes(x = factor(dose), y = len)) +
geom_boxplot()
- Change legend title for a given aesthetic (fill, color, size, shape, linetype, …):
p + labs(fill = "Dose (mg)")
- Remove legend:
p + theme(legend.position = "none")
- Change legend position. Possible values: “left”,“top”, “right”, “bottom”, “none”.
p + theme(legend.position = "top")
Recommended for you
This section contains best data science and self-development resources to help you on your path.
Books - Data Science
Our Books
- Practical Guide to Cluster Analysis in R by A. Kassambara (Datanovia)
- Practical Guide To Principal Component Methods in R by A. Kassambara (Datanovia)
- Machine Learning Essentials: Practical Guide in R by A. Kassambara (Datanovia)
- R Graphics Essentials for Great Data Visualization by A. Kassambara (Datanovia)
- GGPlot2 Essentials for Great Data Visualization in R by A. Kassambara (Datanovia)
- Network Analysis and Visualization in R by A. Kassambara (Datanovia)
- Practical Statistics in R for Comparing Groups: Numerical Variables by A. Kassambara (Datanovia)
- Inter-Rater Reliability Essentials: Practical Guide in R by A. Kassambara (Datanovia)
Others
- R for Data Science: Import, Tidy, Transform, Visualize, and Model Data by Hadley Wickham & Garrett Grolemund
- Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow: Concepts, Tools, and Techniques to Build Intelligent Systems by Aurelien Géron
- Practical Statistics for Data Scientists: 50 Essential Concepts by Peter Bruce & Andrew Bruce
- Hands-On Programming with R: Write Your Own Functions And Simulations by Garrett Grolemund & Hadley Wickham
- An Introduction to Statistical Learning: with Applications in R by Gareth James et al.
- Deep Learning with R by François Chollet & J.J. Allaire
- Deep Learning with Python by François Chollet
Version: Français
Excellent! Thank you!
Hello, I was wondering if you would have details on how to remove a single entry from a legend?
another Excellent article
from STHDA = always the best.
thanks!!!.