我有许多使用 sf
库在 R
中生成的 map ,我希望有一个漂亮的图例。不幸的是,似乎 geom_sf()
的标准图例是这些 ugly looking boxes 。我能找到的关于调整 ggplot2 图例中的形状的唯一帖子是 here 。
这里是使用guides(colour =guide_legend(override.aes = list(shape = 16)))
;然而,这似乎只适用于geom_point()
,而不适用于geom_sf()
。
除非有人可以建议另一种方法来更改图例对象的形状,否则我将需要在 Inkscape 中设计一个自定义图例并将其与各种 map 对齐。
这是一段代码,展示了我已经尝试过的内容:
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
最佳答案
此答案不是解决图例位置问题,而是更改图例图标。从您的示例中,我收集您的数据,生成一个默认情况下如下所示的图例:
# 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
参数来设置您想要的图例形状的功能。
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 文件。
关于r - 在 R 中动态对齐图(空间图的自定义 ggplot2 图例),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58172102/