Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Combine and merge legends in ggplot2 with patchwork

I would like to combine two or more plots merging their legends.

For example, I can create some data and two scenarios as follows.

# packages
library(ggplot2)
library(patchwork)

# first plot
set.seed(07042020)
x <- runif(50)
y <- runif(50)
data1 <- data.frame(x = x, y = y, z = runif(50, 0, 2))
p1 <- ggplot(data1) + geom_point(aes(x, y, col = z))
p1

data2 <- data.frame(x = x, y = y, z = runif(50, -1, 1))
p2 <- ggplot(data2) + geom_point(aes(x, y, col = z))
p2

The following code is what I tried so far but it's not the intended result. I would like to merge the two plots with a single legend, i.e. create a unique and common legend "z" in such a way that the points of the two plots are coloured according to this common legend. Is this possible?

p1 + p2 + plot_layout(guides = "collect")

Created on 2020-04-07 by the reprex package (v0.3.0)

like image 670
agila Avatar asked Apr 07 '20 09:04

agila


1 Answers

I think two legends can only be combined when they have the exact same properties, i.e. share limits, labels, breaks etc. You can provide a common legend by sharing a common scale, one way to do that in patchwork is to use the & operator, which sort of means 'apply this to all previous plots':

p1 + p2 + plot_layout(guides = "collect") & 
  scale_colour_continuous(limits = range(c(data1$z, data2$z)))

enter image description here

Only downside is that you'd probably manually have to specify the limits as the scale in p1 does not know about the values in p2.

like image 66
teunbrand Avatar answered Sep 22 '22 19:09

teunbrand