如何为MultiPolygon类型Shapefile按经度设置渐变填充色?
MultiPolygon地图按经度渐变填充的解决方法
问题核心
你的马来西亚地图是单个MultiPolygon要素,无法直接通过fill=longitude映射渐变——因为单个要素没有可用于映射的经度字段。要实现东西方向(经度)的颜色渐变,需要让地图的每个绘制单元关联对应的经度值。
可行方案
方案1:直接用ggplot内置统计量获取经度
这是最简洁的方法,利用geom_sf的after_stat(x)直接提取每个绘制点的经度值,无需额外处理Shapefile:
library(ggplot2) library(sf) MY_map <- read_sf("gadm36_MYS_0.shp") ggplot() + geom_sf(data = MY_map, aes(fill = after_stat(x))) + # x对应WGS84坐标系下的经度 scale_fill_gradient(low = "#1E88E5", high = "#D81B60", limits = c(100, 120)) + labs(fill = "经度")
注意:你之前误用了scale_color_gradient,这里控制填充色需要用scale_fill_gradient。
方案2:拆分MultiPolygon并计算子区域中心经度
如果需要对每个子多边形做更精细的控制,可以先拆分MultiPolygon,再计算每个子区域的中心经度:
library(ggplot2) library(sf) MY_map <- read_sf("gadm36_MYS_0.shp") # 将MultiPolygon拆分为独立的Polygon要素 MY_map_split <- st_cast(MY_map, "POLYGON") # 计算每个Polygon的中心经度 MY_map_split$lon <- st_coordinates(st_centroid(MY_map_split))[, "X"] ggplot() + geom_sf(data = MY_map_split, aes(fill = lon)) + scale_fill_gradient(low = "#1E88E5", high = "#D81B60", limits = c(100, 120)) + labs(fill = "经度")
内容的提问来源于stack exchange,提问作者Lilnet Cloud
相关产品推荐
相关产品推荐

