Reputation: 3472
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)
Upvotes: 23
Views: 21609
Reputation: 37933
I think two legends can only be combined when they have the exact same properties, i.e. share limits, titles, 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)))
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
.
EDIT: I've since learned that legends are merged if they are the same on the level of {grid} objects. As a consequence, you probably cannot merge legends that are styled differently through the theme or if keys represent a different number of layers (i.e. when combining a plot with 1 point layer with a plot with 2 point layers represented in the legend).
Upvotes: 36
Reputation: 95
I know what you are trying to accomplish and have had luck. Perhaps, R is reading these as two seperate legends. Can you try manually editing each legend (even if to keep it as "z"), then using patchwork to combine?
another troubleshooting thing I've tried is to try to re-arrange your code just to ensure everything is read in correctly:
(p1 + p2) + plot_layout(guides = "collect")
Upvotes: 4