r - 在 R 中动态对齐图(空间图的自定义 ggplot2 图例)

标签 r ggplot2 legend

我有许多使用 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)

Good legend location example

在这种情况下,输出看起来不错;然而,这对我不起作用,因为它需要对每个图进行手动调整。

我想要的是根据 ggplot 对象动态放置此图例的位置,这取决于我正在绘制的城市。

Bad legend location example

完整的代码(和数据)可以从 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))

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 文件。

关于r - 在 R 中动态对齐图(空间图的自定义 ggplot2 图例),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58172102/

相关文章:

r - R 中带有 NA 的日期列 - 变异的意外行为

r - 多组密度图的交集

r - 使用 ggplot2 创建函数

r - 组合线和条形几何图形: How to generate proper legend?

python - Python 中情节外的图例 - matplotlib

r - 使 rbind 循环更快

java - 为 Java 方法自动生成 R 包装器

r - 在 R 曲线中绘制 Logscale()

r ggplot - 更改 x 轴刻度标签而不丢失 geom_smooth 统计数据

r - 如何使用 ggplot2 将新图例添加到复杂的散点图