首页 > 解决方案 > R中的动态对齐图(空间图的自定义ggplot2图例)

问题描述

我有许多R使用该sf库生成的地图,我希望有一个漂亮的图例。不幸的是,标准的传说似乎geom_sf()是这些丑陋的盒子。我能找到的关于调整ggplot2图例中的形状的唯一 SO 帖子是在这里

这里是使用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

标签: rggplot2legend

解决方案


这个答案不是为了解决图例位置,而是改变图例图标。从您的示例中,我收集您的数据会生成一个默认情况下看起来像这样的图例:

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

在此处输入图像描述

不久前,ggplot 添加了通过隐式(通过省略号)将key_glyph参数添加到所有图层(例如 geoms 和 stats)来设置您想要的图例形状的功能。

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

在此处输入图像描述

您可以使用它来将字形设置为点,然后使用该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))))

在此处输入图像描述

它应该与 ggplot 中已经存在的所有常规图例放置工具一起使用。您可能必须为绘图指定特定位置,但至少在添加图例之前不必先将图例导出到 svg 文件。


推荐阅读