Комбинируйте и объединяйте легенды в 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)


person agila    schedule 07.04.2020    source источник
comment
Почему простой график ggplot с фасетами и свободными осями y не выполняет то, что требуется?   -  person Mark Neal    schedule 07.04.2020
comment
Мне следовало добавить больше деталей, извините. Я думал об использовании фасетов, но я не уверен на 100%, что это сработает, поскольку в ближайшем будущем мне придется использовать этот тип кода для построения 4 или 9 простых объектов объектов, имеющих несколько геометрических форм. Фасетное решение подразумевает, что я должен повторить каждый геометрический объект несколько раз и создать большой набор данных (который, возможно, также очень медленно строится, я еще не уверен). Поэтому мне было интересно, можно ли избежать этого шага простым слиянием отдельных графиков.   -  person agila    schedule 07.04.2020


Ответы (2)


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

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

введите описание изображения здесь

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

person teunbrand    schedule 07.04.2020
comment
Извините, но мне потребовалось несколько дней, чтобы проверить результаты на реальном геометрическом объекте, и, похоже, он работает отлично. Спасибо! - person agila; 11.04.2020

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

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

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

person Millionhorns    schedule 07.04.2020