Combine and merge legends in ggplot2 with patchwork

和自甴很熟 提交于 2021-02-09 19:34:25

问题


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)


回答1:


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)))

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.




回答2:


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")



来源:https://stackoverflow.com/questions/61077254/combine-and-merge-legends-in-ggplot2-with-patchwork

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!