настроить легенду в ggplot2 с sf объектами - PullRequest
0 голосов
/ 13 ноября 2018

Я строю (отображаю) sf объекты с ggplot2. Насколько я понимаю, поскольку версия 2.2.1 ggplot2 содержит geom geom_sf, для простых объектов объектов.

Я могу создать нужную карту, выполнив следующие действия:

library(sf)
library(ggplot2)

# some points to start with
a <- st_as_sf(data.frame(lon = c(1,4,6), lat = c(0,0,-3)), coords = c('lon', 'lat'))
b <- st_as_sf(data.frame(lon = c(2.5,4), lat = c(-4.5,-5)), coords = c('lon', 'lat'))

# circles around those points
buf.a <- st_buffer(a, 1)
buf.b <- st_buffer(b, 1)

# colors to mark the points
sol.a = rgb(1,0,0) 
sol.b = rgb(0,0,1) 

# colors to fill the circles
fil.a = adjustcolor(sol.a, alpha.f = .25)
fil.b = adjustcolor(sol.b, alpha.f = .25)

# the plot I want
g = ggplot() +
    geom_sf(data = buf.a, fill =  fil.a, color = NA) +
    geom_sf(data = buf.b, fill =  fil.b, color = NA) +
    geom_sf(data = a,     color = sol.a, shape = 20, size = 3) +
    geom_sf(data = b,     color = sol.b, shape = 20, size = 3)
g

, который производит

enter image description here

Это то, что я хочу, за исключением того, что в нем отсутствует легенда. Для этого я делаю

cols.fill = c("GROUP A" = fil.a, "GROUP B" = fil.b)
cols.sol = c("GROUP A" = sol.a, "GROUP B" = sol.b)

g = ggplot() +
    geom_sf(data = buf.a, color = NA, aes(fill = 'GROUP A')) +
    geom_sf(data = buf.b, color = NA, aes(fill = 'GROUP B')) +
    geom_sf(data = a,     shape = 20, size = 3, aes(color = 'GROUP A')) + 
    geom_sf(data = b,     shape = 20, size = 3, aes(color = 'GROUP B')) +
    scale_fill_manual(name = "circles", values = cols.fill) +
    scale_color_manual(name = "points", values = cols.sol)
g

, что дает

enter image description here

Это не то, что я хочу, потому что в легенде:

  1. «точки» должны быть точками (не квадратами); и
  2. 'круги' должны быть кругами (опять же, не квадратами)

Было бы неплохо, если бы легенда могла уважать прозрачность моих цветов (что и было в этом примере).

Я пытался изменить последние пару строк выше на что-то вроде

scale_fill_manual(name = "circles", values = cols.fill,
                  guide = guide_legend(override.aes = list(shape = c(19, 19)))) +
scale_color_manual(name = "points", values = cols.sol,
                   guide = guide_legend(override.aes = list(shape = c(20, 20))))

но это ничего не изменило с моим сюжетом.

Идеи

Примечание. Если это окажется проще для графика, я мог бы изменить структуру данных, например, комбинируя объекты a и b в одном и том же простом объекте и добавить столбец с указанием группы ( то же самое для buf.a и buf.b).

1 Ответ

0 голосов
/ 16 ноября 2018

Вот как далеко мне удалось добраться.

g = ggplot() +
    geom_sf(data = buf.a, color = NA, aes(fill = 'GROUP A'), show.legend = "point") +
    geom_sf(data = buf.b, color = NA, aes(fill = 'GROUP B'), show.legend = "point") +
    geom_sf(data = a,     shape = 20, size = 3, aes(color = 'GROUP A'), show.legend = "point") + 
    geom_sf(data = b,     shape = 20, size = 3, aes(color = 'GROUP B'), show.legend = "point") +
    scale_color_manual(name = "points", values = cols.sol,
                       guide = guide_legend(override.aes = list(shape = c(20, 20)))) +
    scale_fill_manual(name = "circles", values = cols.fill,
                      guide = guide_legend(override.aes = list(shape = c(20, 20), color = cols.fill, size = 8)))
g

enter image description here

Чтобы избавиться от серого фона в условных обозначениях,

g + theme(legend.key = element_rect(fill = "white"))

enter image description here

Единственная проблема здесь в том, что круги не имеют той прозрачности, которую я хотел. Это странно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...