Объединяйте и объединяйте легенды в ggplot2 с пэчворком - PullRequest
1 голос
/ 07 апреля 2020

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

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

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

Создано в 2020-04-07 пакетом Представить (v0.3.0)

Ответы [ 2 ]

2 голосов
/ 07 апреля 2020

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

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

enter image description here

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

0 голосов
/ 07 апреля 2020

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

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

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

...