多个 geom_sf 数据集的 ggplot 给出不匹配的图例颜色

问题描述 投票:0回答:1

我正在尝试创建一个 ggplot 地图,其中包含两个简单的要素线数据集。我希望这些线要么出现在同一个图例中,要么出现在单独的图例中。然而,我采用的方法导致绘图颜色和图例颜色之间不匹配。

这是一个显示问题的简单示例。

library("sf")
library("sfheaders")
library("ggplot2")

df1 <- data.frame(
  x = c(0,1,0,1,0,1), 
  y = c(1,1,2,2,3,3),
  id = c("A","A","B","B","D","D")
)
df2 <- data.frame(
  x = c(0,1), 
  y = c(4,4),
  id= c("C","C")
)

set1_sf <- sfheaders::sf_linestring(
  obj = df1, x = "x", y = "y", linestring_id = "id"
)
set2_sf <- sfheaders::sf_linestring(
  obj = df2, x = "x", y = "y", linestring_id = "id"
)

palette <- c("#7FC97F","#BEAED4","#FDC086")   

ggplot() +
  geom_sf(set1_sf, mapping=aes(colour=id), lwd=0.8) + 
  geom_sf(set2_sf, mapping=aes(colour=id), lwd=0.8) +
  scale_colour_manual(name="Lines",
                      values = c(palette,"black"),
                      labels = c(set1_sf$id, set2_sf$id))

结果如下:

enter image description here

在输出图的图例中,线 A、B 和 D 使用调色板颜色正确着色,线 C 为黑色。然而,在绘图本身上,D 和 C 的颜色错误地交换了。

如果我将 df2 中的 id 值更改为“X”,绘图颜色将正确显示。

我做错了什么? 有更好的办法吗?

r ggplot2 legend scale-color-manual geom-sf
1个回答
0
投票

返回所需结果的一种方法是使用

breaks =
显式重新排序图例键:

library("ggplot2")

# Legend order vector
legend_order <- c("A", "B", "D", "C")

ggplot() +
  geom_sf(data = set1_sf, mapping = aes(colour = id), lwd = 0.8) + 
  geom_sf(data = set2_sf, mapping = aes(colour = id), lwd = 0.8) +
  scale_colour_manual(name = "Lines",
                      values = c(palette, "black"),
                      breaks = legend_order,
                      labels = legend_order)

1

© www.soinside.com 2019 - 2024. All rights reserved.