One way to return your desired outcome is to use breaks =
to explicitly reorder the legend keys:
library(ggplot2)
# Legend order vector
key_ord <- c("A", "B", "D"set1_sf$id, "C"set2_sf$id)
ggplot() +
geom_sf(data = set1_sf, aes(colour = id), lwd = 0.8) +
geom_sf(data = set2_sf, aes(colour = id), lwd = 0.8) +
scale_colour_manual(name = "Lines",
values = c(palette, "black"),
breaks = key_ord,
labels = key_ord)