Динамическое выравнивание графиков (пользовательская легенда ggplot2 для пространственных карт) в R - PullRequest
2 голосов
/ 30 сентября 2019

У меня есть несколько карт, которые я генерирую в R с использованием библиотеки sf, и мне бы хотелось иметь красивую легенду. К сожалению, кажется, что стандартной легендой для geom_sf() являются эти безобразно выглядящие коробки . Единственный пост SO, который я мог найти о корректировке фигур в ggplot2 легендах, это здесь .

Здесь используется guides(colour = guide_legend(override.aes = list(shape = 16)));однако, похоже, что это работает только для geom_point(), а не для geom_sf().

Если кто-то не может предложить альтернативный метод изменения формы объектов легенды, мне потребуется разработать собственную легенду в Inkscape и выровнятьэто вместе с различными картами.

Вот фрагмент кода, чтобы показать, что я уже пробовал:

legend <- image_read_svg('https://svgshare.com/i/FDV.svg')
p1 <- ggplot() + 
  geom_sf(data=otherroads, size = .45, aes(color=SUFTYPABRV)) + 
  geom_sf(data=allroads, size = .55, aes(color=SUFTYPABRV)) + 
  scale_color_manual(values = plotcolors, guide = "legend") + theme_map() +
  labs(title = "Sydney")

ggdraw() +
 draw_plot(p1) +
 draw_image(legend, width = 0.4, hjust = -0.75, vjust = 0.43)

Пример расположения хорошей легенды

Выход выглядит хорошо в этом случае;однако, это не будет работать для меня, потому что это требует ручной настройки для каждого сюжета.

Мне бы хотелось, чтобы местоположение этой легенды было динамически размещено в соответствии с объектом ggplot, который зависит от города, который я черчу.

Пример расположения плохой легенды

Код (и данные) целиком можно клонировать из github: https://github.com/moldach/map-help.git

1 Ответ

1 голос
/ 30 сентября 2019

Этот ответ не для адресации легенды, а для изменения значков легенды. Из ваших примеров я собираю, что ваши данные создают легенду, которая по умолчанию выглядит следующим образом:

# example from the geom_sf help page
nc <- sf::st_read(system.file("shape/nc.shp", package = "sf"), quiet = TRUE)

# throwing in some random categorical data
nc$catvar <- sample(LETTERS[1:5], nrow(nc), replace = TRUE)

ggplot(nc) +
  geom_sf(aes(colour = catvar))

enter image description here

Не так давно ggplot добавилвозможность установить желаемую форму легенды путем неявного (с помощью многоточия) добавления аргумента key_glyph ко всем слоям, таким как геометрия и статистика.

ggplot(nc) +
  geom_sf(aes(colour = catvar), key_glyph = "timeseries")

enter image description here

Вы можете использовать это, чтобы установить глиф в точках, а затем использовать трюк override.aes, чтобы получить нужные фигуры.

ggplot(nc) +
  geom_sf(aes(colour = catvar), key_glyph = "point") +
  guides(colour = guide_legend(override.aes = list(size = 3, shape = c(15:19))))

enter image description here

Он должен работать со всеми обычными инструментами размещения легенд, которые уже есть в ggplot. Возможно, вам придется указать места, специфичные для сюжета, но, по крайней мере, вам не придется сначала экспортировать легенду в SVG-файлы, прежде чем добавлять их.

...