I have a couple spatial shape files with various public transport routes and I would like to make a map using ggplot2
and sf
libraries. The issue here is that I manually assign colors to a few specific routes but I couldn't manage to add a legend to the plot.
Any idea on how to do this using geom_sf
?
Reproducible example
library(sf)
library(ggplot2)
# reproducible data
lon<-c(5.121420, 6.566502, 4.895168, 7.626135)
lat<-c(52.09074, 53.21938, 52.37022, 51.96066)
cities<-c('utrecht','groningen','amsterdam','munster')
size<-c(300,500,1000,50)
xy.cities<-data.frame(lon,lat,cities,size)
# line example
line1 <- st_linestring(as.matrix(xy.cities[1:2,1:2]))
line2 <- st_linestring(as.matrix(xy.cities[3:4,1:2]))
lines.sfc <- st_sfc(list(line1,line2))
simple.lines.sf <- st_sf(id=1:2,size=c(10,50),geometry=lines.sfc)
# plot
ggplot() +
geom_sf(data= subset(simple.lines.sf, id==1), color="red" ) +
geom_sf(data= subset(simple.lines.sf, id==2), color="blue" )
I know it would be possible to do something like this:
ggplot() +
geom_sf(data= subset(simple.lines.sf, id>0), aes(color=factor(id)) ) +
scale_color_manual(values=c("red", "blue"),
labels=c("route 1", "route 2"))
However, I'm working with more than one shape file so I need to use more than one geom_sf
. Also, I would like the legend to look a line legend, not a polygon legend.
We can use the argument show.legend
from geom_sf
here.
ggplot() +
geom_sf(data= simple.lines.sf, aes(colour = as.factor(id)), show.legend = "line")
Description of show.legend
from ?geom_sf
logical. Should this layer be included in the legends? NA, the default, includes if any aesthetics are mapped. FALSE never includes, and TRUE always includes. You can also set this to one of "polygon", "line", and "point" to override the default legend.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With