使用north2()添加指北针后,ggsave保存地图丢失指北针的问题
解决ggsave保存带north2指北针的地图时元素丢失的问题
嗨,我明白你遇到的困扰了!刚用R做地图的时候很容易踩这个坑——其实问题出在north2()的工作方式上:
north2()来自ggsn包,它并不是ggplot的图层元素,而是通过grid包的函数,在已经绘制好的ggplot图形上叠加指北针。这属于「设备级」的绘图操作,而ggsave()默认只会保存ggplot对象本身包含的图层内容,不会捕获后续用grid添加的额外元素,所以直接保存graph1就会丢失指北针。
下面给你两种可行的解决方案:
方法一:手动控制绘图设备(最直接)
先打开一个绘图设备(比如png、pdf),在同一个设备里完成ggplot绘制、添加指北针,最后关闭设备,这样所有内容都会被保存:
# 1. 打开png绘图设备,设置尺寸和分辨率 png("map_with_north.png", width = 8, height = 6, units = "in", res = 300) # 2. 绘制你的ggplot地图 graph1 <- ggplot() + geom_polygon(data=df, colour="black", aes(x=long, y=lat, group=group, fill=ALG)) + # 这里可以添加你的其他ggplot设置,比如主题、坐标转换等 theme_minimal() # 3. 必须打印ggplot对象到设备(脚本中不会自动渲染) print(graph1) # 4. 添加指北针,x/y是相对绘图区域的比例(0-1),scale调整大小 north2(graph1, x = 0.1, y = 0.9, scale = 0.1) # 5. 关闭设备,完成保存 dev.off()
方法二:将指北针转为ggplot图层
把north2()生成的指北针转为ggplot的注释图层,这样整个图形就是一个完整的ggplot对象,直接用ggsave()保存即可:
# 1. 创建基础ggplot地图 graph1 <- ggplot() + geom_polygon(data=df, colour="black", aes(x=long, y=lat, group=group, fill=ALG)) + theme_minimal() # 2. 生成指北针的grob对象(draw=FALSE表示不直接绘制,只返回对象) north_grob <- north2(graph1, x = 0.1, y = 0.9, scale = 0.1, draw = FALSE) # 3. 将grob添加为ggplot的注释图层 graph1_with_north <- graph1 + annotation_custom( grob = north_grob, xmin = -Inf, xmax = Inf, # 覆盖整个x轴范围 ymin = -Inf, ymax = Inf # 覆盖整个y轴范围 ) # 4. 直接用ggsave保存完整的ggplot对象 ggsave("map_with_north.png", graph1_with_north, width = 8, height = 6, dpi = 300)
小提醒
- 方法一里的
print(graph1)不能省略,脚本中ggplot不会自动渲染到设备,必须手动打印。 - 调整
north2()的x、y、scale参数可以改变指北针的位置和大小,避免遮挡地图内容。
内容的提问来源于stack exchange,提问作者NBE
相关产品推荐
相关产品推荐

