如何在ggplot绘制的中国地图中添加南海诸岛小图?
为中国地图添加南海区域小图的实现方法
现有数据与绘图流程
中国地图的shapefile数据包含bou2_4p.dbf、bou2_4p.shp、bou2_4p.shx三个文件,保存至D:/map data文件夹。
读取地图数据
setwd("D:/map data") library(rgdal) china_map = readOGR(file.choose()) # 选择bou2_4p.shp打开
数据预处理与基础地图绘制
library(plyr) library(ggplot2) library(viridis) # 编码转换解决中文乱码 china_map@data$province <- iconv(china_map@data$NAME, from = "CP936", to = "UTF-8") # 添加ID字段用于数据关联 china_map@data$id = rownames(china_map@data) # 转换为ggplot兼容的格式 china.points = fortify(china_map, region="id") china.df = join(china.points, china_map@data, by="id") # 准备点位数据 data2 <- data.frame( city = c("NJ","AH","BJ","CD","CQ"), count = c(15,32,45,52,24), lat = c(32,31,39,29,29), long = c(118,117,116,111,106) ) # 绘制基础地图 base_plot <- ggplot() + geom_polygon(data=china.df, aes(x = long, y = lat, group = group), fill="white", color="grey40") + geom_point(data=data2, aes(x = long, y = lat, size=count, color=count, alpha=count)) + scale_size_continuous(range=c(1,10)) + scale_color_viridis(option="inferno", trans="log") + scale_alpha_continuous(trans="log") + theme(legend.position = "none")
现有绘制效果:
无南海小图的中国地图
需要实现的效果:
右下角带有南海区域小图的中国地图
添加南海小图的具体步骤
1. 提取南海区域地理数据
从已加载的china_map中筛选出南海诸岛的图层(需确保shapefile包含该区域数据):
# 筛选南海诸岛数据(NAME字段值以实际数据为准) south_china_sea <- china_map[china_map@data$NAME == "南海诸岛", ] # 转换为ggplot兼容格式 scs.points <- fortify(south_china_sea, region="id") scs.df <- join(scs.points, south_china_sea@data, by="id")
2. 绘制南海小图
单独绘制简洁的南海区域小图,去除不必要的元素:
scs_plot <- ggplot() + geom_polygon(data=scs.df, aes(x = long, y = lat, group = group), fill="white", color="grey40") + # 聚焦南海区域的坐标系范围 coord_fixed(xlim = c(105, 125), ylim = c(0, 25)) + theme_void() # 移除坐标轴、网格等冗余元素
3. 组合主图与小图
使用patchwork包实现图中图布局(需先安装该包):
install.packages("patchwork") library(patchwork) # 将小图嵌入主图右下角,调整位置与大小参数适配布局 final_plot <- base_plot + inset_element( scs_plot, left = 0.75, bottom = 0.05, right = 0.98, top = 0.3, align_to = "plot" ) # 输出最终地图 print(final_plot)
注意事项
- 如果现有shapefile未包含南海诸岛数据,需更换包含完整中国疆域的shapefile文件。
- 可通过修改
inset_element中的位置参数(left/bottom/right/top)微调小图的位置和尺寸,达到最佳视觉效果。
内容的提问来源于stack exchange,提问作者Robin
相关产品推荐
相关产品推荐

