Объединить легенды отдельных слоев геома - PullRequest
0 голосов
/ 29 июня 2018

Я строю точечные данные из двух отдельных слоев на карте и хотел бы отобразить информацию обоих слоев в одной легенде.

Вот код, иллюстрирующий проблему:

set.seed(42)  
lat1 <- rnorm(10, 54, 12)
long1 <- rnorm(10, 44, 12)
val1 <- rnorm(10, 10, 3)
lat2 <- rnorm(10, 54, 12)
long2 <- rnorm(10, 44, 12)
val2 <- rnorm(10, 10, 3)

df1 <- as.data.frame(cbind(long1, lat1, val1))
df2 <- as.data.frame(cbind(long2, lat2, val2))

library(ggplot2)
library(scales)

f <- ggplot() +
     geom_point(data=df1, aes(x=lat1, y=long1, size=val1, fill=val1), shape=21, alpha=0.6) +
     scale_size_continuous(range = c(2, 12), breaks=pretty_breaks(4)) +
     scale_fill_distiller(direction = -1, palette="RdYlBu", breaks=pretty_breaks(4)) +     
     guides(fill = guide_legend(), size = guide_legend()) +
     theme_minimal()
p <- f + geom_point(data=df2, aes(x=lat2, y=long2, color="val2"), shape=17, size=3) +
     scale_color_manual(values="black",name="")
p

Лучшее, чем я могу управлять, - это создать две отдельные легенды и затем удалить одну из названий легенд. В идеале как заполненные круги, так и черный бриллиант должны быть частью одной и той же легенды, например, «Ценность» и черный бриллиант будут читать, например, "NA". Любая помощь высоко ценится!

1 Ответ

0 голосов
/ 13 июля 2018

Мы должны построить две разные легенды, но переместить их близко друг к другу (для использования отрицательного значения в legend.spacing.y требуется ggplot2_3.0.0). Этот подход создает другую проблему - две легенды не совпадают, поэтому мы должны нанести еще один набор алмазов (больше, чтобы соответствовать не бриллиантам, но невидимым alpha = 0)

ggplot() +
    geom_point(data = df1, 
               aes(lat1, long1, size = val1, fill = val1), 
               shape = 21, alpha = 0.6) +
    geom_point(data = df2, 
               aes(lat2, long2, color = "val2"), 
               shape = 17, size = 3) +
    geom_point(data = df2, 
               aes(lat2, long2, color = "val2"), 
               shape = 17, size = 11.5, alpha = 0) +
    scale_size_continuous(range = c(2, 12), breaks = pretty_breaks(4)) +
    scale_fill_distiller(direction = -1, palette = "RdYlBu", breaks = pretty_breaks(4)) +     
    scale_color_manual(values = "black", name = "Value\n") +
    labs(fill = NULL,
         size = NULL) +
    guides(fill = guide_legend(), 
           size = guide_legend(),
           color = guide_legend(order = 1)) +
   theme_minimal() +
   theme(legend.spacing.y = unit(-0.4, "cm"))

enter image description here

...