Комбинируйте и объединяйте легенды в ggplot2 с помощью пэчворка

Хочется объединить два и более сюжета, объединив их легенды.

Например, я могу создать некоторые данные и два сценария следующим образом.

# 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

Следующий код - это то, что я пробовал до сих пор, но это не предполагаемый результат. Я хотел бы объединить два графика с одной легендой, т.е. создать уникальную и общую легенду "z" таким образом, чтобы точки двух графиков были окрашены в соответствии с этой общей легендой. Это возможно?

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

Создано 07.04.2020 пакетом REPEX (v0.3.0)

2 ответа

Решение

Я думаю, что две легенды можно объединить только в том случае, если они имеют одни и те же свойства, то есть общие ограничения, метки, разрывы и т. Д. Вы можете создать общую легенду, используя общий масштаб, один из способов сделать это в лоскутном одеянии - использовать & оператор, который означает "применить это ко всем предыдущим графикам":

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

Единственным недостатком является то, что вам, вероятно, придется вручную указывать пределы как масштаб в p1 не знает о значениях в p2.

Я знаю, чего вы пытаетесь достичь, и мне повезло. Возможно, R читает их как две отдельные легенды. Можете ли вы попробовать вручную отредактировать каждую легенду (даже если оставить ее как "z"), а затем использовать лоскутное одеяло для объединения?

еще одна вещь для устранения неполадок, которую я пробовал, - это попытаться переупорядочить ваш код, чтобы убедиться, что все читается правильно:

(p1 + p2) + plot_layout(guides = "собрать")

Другие вопросы по тегам