我正在尝试创建一个 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))
结果如下:
在输出图的图例中,线 A、B 和 D 使用调色板颜色正确着色,线 C 为黑色。然而,在绘图本身上,D 和 C 的颜色错误地交换了。
如果我将 df2 中的 id 值更改为“X”,绘图颜色将正确显示。
我做错了什么? 有更好的办法吗?
返回所需结果的一种方法是使用
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)