如何在 ggplot 中为 Robinson 投影地图添加边框和坐标标签?
数据阿明
结论
边框位置异常,是因为构造边框时使用了投影前的经纬度范围。当前代码先根据经纬网计算包围盒,再将这个经纬度矩形转换到 Robinson 投影。投影会改变矩形边线的形状和位置,所以转换后的矩形不一定能作为地图外框。可以直接根据投影后的地图数据 world_robinson 计算包围盒,再用它绘制边框。
坐标标签可以由 coord_sf() 生成。theme_void() 会隐藏坐标轴元素;如果需要显示标签,可以改用保留坐标轴元素的主题,例如 theme_minimal()。
修改代码
将原来的 border 构造替换为:
border <- st_as_sfc(st_bbox(world_robinson))
绘图部分可以写成:
ggplot() +
geom_sf(data = world_robinson) +
geom_sf(data = border, fill = NA, color = "black", linewidth = 1) +
coord_sf(
crs = st_crs(robinson),
datum = st_crs(4326)
) +
theme_minimal()
st_bbox(world_robinson) 取得的是地图投影后的坐标范围。st_as_sfc() 会将这个范围转换为矩形几何。fill = NA 让边框只显示轮廓,不会遮住地图。coord_sf() 使用 Robinson 坐标系,并以 EPSG
注意事项
st_set_crs(4326)只会设置坐标参考系元数据,不会转换坐标。只有当world的坐标本来就是经纬度时,才应这样设置。如果坐标系已经正确标注,可以省略这一步。theme_void()会隐藏坐标轴文字。若要继续使用它,需要另外设置主题元素来显示坐标标签。- 如果外框需要严格对应固定的地图范围,可以按需设置
coord_sf()的范围。上面的包围盒方案使用world_robinson当前几何的范围。
备注:内容仅供参考。
