Merging Legends in ggplot2: A Single Legend for Multiple Scales

Merging Legends in ggplot2

When working with multiple scales in a single plot, it’s common to want to merge their legends into one. In this example, we’ll explore how to achieve this using the ggplot2 library.

The Problem

In the provided code, we have three separate scales: color (color=type), shape (shape=type), and a secondary y-axis scale (sec.axis = sec_axis(~., name = expression(paste('Methane (', mu, 'M)')))). These scales have different labels, which results in two separate legends.

The Solution

To merge the legends into one, we need to give all three scales the same name. This can be done by adding a name argument to each scale and setting it equal to the desired label.

Here’s the modified code:

library(ggplot2)

ggplot(ch4.data, aes(x=date, y=value)) +
  geom_line(aes(color=type)) +
  geom_point(aes(shape=type, fill=type), color = "black", size=4) +
  scale_shape_manual(name = "Type", values = c(21:23)) +
  scale_fill_manual(name = "Type", values = c("darkorchid3","indianred3","dodgerblue3")) +
  scale_color_manual(name = "Type", values = c("darkorchid3","indianred3","dodgerblue3")) +
  annotate("rect", xmin=as.POSIXct("2017-11-09"), xmax=as.POSIXct("2018-04-09"),ymin=0,ymax=75,alpha=.25) +
  scale_y_continuous(sec.axis = sec_axis(~., name = expression(paste('Methane (', mu, 'M)')))) +
  labs(y = expression(paste('Methane (', mu, 'M)')), x = "", color = "", shape = "") +
  theme_linedraw(base_size = 18) +
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), 
        strip.text = element_text(face = "bold")) +
  theme(axis.text = element_text(angle = 45, hjust = 1))

Explanation

In this modified code:

  • We’ve added a name argument to each scale (scale_shape_manual, scale_fill_manual, and scale_color_manual) and set it equal to "Type". This gives all three scales the same name.
  • We’ve removed the empty labels for the color and shape scales, which were causing them to appear as separate legends.

With these changes, the legend is now merged into one, making it easier to compare the different types of data.

Tips and Variations

  • To customize the appearance of your legend, you can use various options available in the theme function, such as changing the font size or color.
  • If you need to create multiple legends with different labels, you can simply add additional name arguments to each scale.

Last modified on 2024-09-15