在R的ggplot2与sf中添加交通线路图例及背景地图问题
问题解决方法
一、为交通线路添加图例并调整尺寸
你当前代码中单独调用geom_sf绘制每条线路时,直接指定color参数不属于ggplot的美学映射,因此无法生成图例。解决思路是将4条线路合并为一个sf对象,新增线路名称列后通过aes()映射颜色和尺寸:
- 合并线路数据:
# 给每条线路添加标识列 T1$line <- "T1" T2$line <- "T2" T3$line <- "T3" T4$line <- "T4" # 合并为单个sf对象 all_lines <- rbind(T1, T2, T3, T4)
- 修改ggplot线路绘制部分:
替换原有的4个geom_sf为一个,通过aes()映射color和size,再手动指定颜色与尺寸:
ggplot() + geom_sf(data = Geo_3M) + # 合并后的线路图层,映射颜色和尺寸到线路标识 geom_sf(data = all_lines, aes(color = line, size = line)) + # 指定每条线路的颜色 scale_color_manual(values = c("T1" = "blue", "T2" = "orange", "T3" = "green", "T4" = "brown")) + # 指定每条线路的粗细,数值按需调整 scale_size_manual(values = c("T1" = 1.5, "T2" = 1.2, "T3" = 1, "T4" = 0.8)) + # 保留原有图层设置 geom_point(data = tableau_résultat, aes(x = Longitude, y = Latitude, size = nb_endTime, color = categorie)) + scale_color_manual(values = couleurs, name = "Duration") + # 重命名避免图例冲突 geom_point(data = Gare, aes(x = lon, y = lat), shape=24, fill="blue") + theme( panel.background = element_rect(fill = "white", color = NA), plot.background = element_rect(fill = "white", color = NA), panel.grid.major = element_blank(), panel.grid.minor = element_blank(), axis.text.x=element_blank(), axis.ticks.x=element_blank(), axis.text.y=element_blank(), axis.ticks.y=element_blank(), axis.title.x = element_blank(), axis.title.y = element_blank())+ labs(size = "Nb")
注:因两个图层使用了
color美学,需通过name参数分别命名图例,避免混淆。
二、添加OSM浅色背景地图
使用ggspatial包的annotation_map_tile()函数实现,步骤如下:
- 安装并加载包:
install.packages("ggspatial") library(ggspatial)
- 在ggplot开头添加背景图层,注意坐标系匹配:
若你的sf对象为WGS84(EPSG:4326),直接使用以下代码:
ggplot() + # 添加浅色OSM背景,zoom值越大越清晰 annotation_map_tile(type = "cartolight", zoom = 12) + # 若Geo_3M为面图层,设置fill=NA避免遮挡背景 geom_sf(data = Geo_3M, fill = NA) + geom_sf(data = all_lines, aes(color = line, size = line)) + scale_color_manual(values = c("T1" = "blue", "T2" = "orange", "T3" = "green", "T4" = "brown")) + scale_size_manual(values = c("T1" = 1.5, "T2" = 1.2, "T3" = 1, "T4" = 0.8)) + geom_point(data = tableau_résultat, aes(x = Longitude, y = Latitude, size = nb_endTime, color = categorie)) + scale_color_manual(values = couleurs, name = "Duration") + geom_point(data = Gare, aes(x = lon, y = lat), shape=24, fill="blue") + theme( panel.background = element_rect(fill = "white", color = NA), plot.background = element_rect(fill = "white", color = NA), panel.grid.major = element_blank(), panel.grid.minor = element_blank(), axis.text.x=element_blank(), axis.ticks.x=element_blank(), axis.text.y=element_blank(), axis.ticks.y=element_blank(), axis.title.x = element_blank(), axis.title.y = element_blank())+ labs(size = "Nb") + # 确保图层与背景坐标系一致 coord_sf(crs = 4326)
若数据使用其他坐标系(如UTM),将
coord_sf()的crs参数改为对应EPSG代码即可。
内容的提问来源于stack exchange,提问作者JC_
相关产品推荐
相关产品推荐

