R语言基于oce包绘制地图的网格标签、点位标注、导出与样式调整问题
核心认知
所用oce包的mapPlot/mapPoints系列函数属于base R绘图体系,并非ggplot2体系,所有语法遵循base R规则——这是ggsave无输出、传入size参数报错的根本原因。
现有代码存在一处笔误:mapPoints中引用的snowpit$lat未定义,需替换为已定义的cord$lat才能正常运行。
具体操作方案
1. 地图保存方法
base R绘图无需使用ggsave,需通过图形设备完成输出,将所有绘图代码夹在设备开启与关闭语句之间即可,适合报告打印的高分辨率输出示例:
# 打开tiff格式输出设备,设置600dpi分辨率匹配印刷要求 tiff("antarctic_map.tiff", units="cm", width=12, height=12, res=600, compression="lzw") # ---------------------- 在此处放置所有绘图代码 ---------------------- library(oce) lat <- c(-77.2, -79.7, -80.7, -80.6) long <- c(123.5, 126.1, 122.2, 121.6) cord <- data.frame(lat, long) par(mar=c(1.5, 1.5, 0.5, 0.5)) mapPlot(coastlineWorld, longitudelim=c(-180, 180), latitudelim=c(-90, -70), projection="+proj=stere +lat_0=-90", col='gray', grid=FALSE) # 嵌入后续网格、点位、标签代码 # ------------------------------------------------------------------- dev.off() # 关闭设备,文件自动写入指定路径
2. 点位文本标签添加
使用oce包自带的mapText()函数,该函数会自动将经纬度坐标转换为当前极射投影的平面坐标,不会出现偏移,无需手动处理投影转换:
# 自定义每个点位对应的标签,可根据实际点位名称修改 point_labels <- c("SP1", "SP2", "SP3", "SP4") mapText(x=cord$long, y=cord$lat, labels=point_labels, pos=3, # 标签位于点位上方,避免遮挡标识点 cex=0.8, # 标签字体大小 col="black")
3. 网格刻度可读性优化
通过调整mapGrid()内置参数即可实现经度标签均匀分布在图幅外圈、纬度标签沿同心圆(等纬圈)排布的效果,无需手动逐个放置标签:
mapGrid(dlongitude = 30, dlatitude = 5, col = "darkgray", lty = "solid", lwd = 0.5, longitudeLabels = TRUE, # 开启经度标签显示 longTickSide = "outer", # 经度标签固定在图幅外边缘均匀分布 latitudeLabels = TRUE, # 开启纬度标签显示 latTickSide = "inner", # 纬度标签沿同心圆内侧排布 labelcex = 0.6, # 刻度标签字体大小 col.ticks = "darkgray")
如需自定义标签格式(如增加方位后缀),可将longitudeLabels参数传入格式化后的文本向量实现。
4. 点位大小调整
base R体系中通过cex参数控制点位缩放比例,而非ggplot2体系的size参数:
# cex为相对默认大小的缩放系数,>1放大、<1缩小 mapPoints(cord$long, cord$lat, pch=2, col="black", cex=1.2)
内容的提问来源于stack exchange,提问作者Raffaello Nardin
相关产品推荐
相关产品推荐

