r - 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
解决方案
这个答案不是为了解决图例位置,而是改变图例图标。从您的示例中,我收集您的数据会生成一个默认情况下看起来像这样的图例:
# 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 文件。
推荐阅读
- node.js - express-fileupload 使用文件大小限制时上传原始文件
- go - 使用反射从深度嵌套的结构中提取标签
- python - 终端 Anaconda 未同步到 Jupyter
- php - Forelse 在 laravel 中无法正常工作?
- c# - 如何使用 Visual Studio 单元测试框架或 NUnit 框架在 C# 中模拟对象?
- d3.js - 在矩形上添加一个圆
- google-cloud-firestore - Firestore 数据库设计:团队 vs 游戏 vs 玩家
- javascript - 有没有办法编写一个命令来在 Google 表格中查找和显示一行的内容?
- python-3.x - Jupiter 脚本文件路径
- c++ - 值调用和指针引用调用