如何在保持比例尺不变的情况下并排绘制加州两个县的地图?
解决方案:同比例尺并排绘制两县地图
完全可以在保持实际比例尺一致的前提下,将San Diego县和Santa Clara县的地图并排展示,以此准确对比二者的实际面积。下面提供两种简单可靠的实现方法:
方法一:数据合并+分面绘制(推荐)
这种方法通过合并两个县的空间数据,利用ggplot的分面功能生成并排地图,同时强制统一坐标范围和比例尺,确保面积对比的准确性。
完整代码
library(tigris) library(ggplot2) library(sf) # 用于处理空间数据边界计算 # 获取两个县的空间数据 san_diego <- county_subdivisions(state = "CA", county = "San Diego County", cb = TRUE, year = NULL) santa_clara <- county_subdivisions(state = "CA", county = "Santa Clara County", cb = TRUE, year = NULL) # 为数据集添加县名标识,方便分面 san_diego$county_name <- "San Diego County" santa_clara$county_name <- "Santa Clara County" # 合并两个数据集 combined_counties <- rbind(san_diego, santa_clara) # 计算两个县的整体边界范围,确保分面后比例尺一致 bbox_sd <- st_bbox(san_diego) bbox_sc <- st_bbox(santa_clara) x_range <- c(min(bbox_sd$xmin, bbox_sc$xmin), max(bbox_sd$xmax, bbox_sc$xmax)) y_range <- c(min(bbox_sd$ymin, bbox_sc$ymin), max(bbox_sd$ymax, bbox_sc$ymax)) # 绘制并排地图 ggplot() + geom_sf(data = combined_counties, color = "black", fill = "white", size = 0.25) + facet_wrap(~county_name, ncol = 2) + # 横向分两列展示 coord_sf(xlim = x_range, ylim = y_range, fixed = TRUE) + # 固定比例尺,统一坐标范围 theme_minimal() + labs(title = "San Diego County vs Santa Clara County (同比例尺对比)")
关键说明
st_bbox()用于获取每个县的地理边界,通过计算两个边界的极值,确保分面后的两个地图使用完全相同的坐标范围coord_sf(fixed = TRUE)强制x轴和y轴的比例尺一致,避免地图拉伸变形,保证面积比例准确- 分面后两个面板共享相同的比例尺,能直观对比两县的实际面积大小
方法二:独立绘图+拼图(patchwork包)
如果需要保留两个独立的ggplot对象,再将它们并排拼接,可以使用patchwork包,同时为两个图设置相同的坐标范围和比例尺。
完整代码
library(tigris) library(ggplot2) library(sf) library(patchwork) # 用于拼图 # 获取空间数据 san_diego <- county_subdivisions(state = "CA", county = "San Diego County", cb = TRUE, year = NULL) santa_clara <- county_subdivisions(state = "CA", county = "Santa Clara County", cb = TRUE, year = NULL) # 计算统一的坐标范围 bbox_sd <- st_bbox(san_diego) bbox_sc <- st_bbox(santa_clara) x_range <- c(min(bbox_sd$xmin, bbox_sc$xmin), max(bbox_sd$xmax, bbox_sc$xmax)) y_range <- c(min(bbox_sd$ymin, bbox_sc$ymin), max(bbox_sd$ymax, bbox_sc$ymax)) # 绘制两个独立的地图,设置相同的坐标范围和比例尺 gg_san_diego <- ggplot() + geom_sf(data = san_diego, color="black", fill="white", size=0.25) + coord_sf(xlim = x_range, ylim = y_range, fixed = TRUE) + ggtitle("San Diego County") + theme_minimal() gg_santa_clara <- ggplot() + geom_sf(data = santa_clara, color="black", fill="white", size=0.25) + coord_sf(xlim = x_range, ylim = y_range, fixed = TRUE) + ggtitle("Santa Clara County") + theme_minimal() # 横向拼接两个图 gg_san_diego + gg_santa_clara + plot_layout(ncol = 2)
关键说明
- 两个图必须使用相同的
xlim和ylim,并设置fixed = TRUE,才能保证比例尺完全一致 patchwork包的plot_layout()可以灵活控制拼图的行列布局
内容的提问来源于stack exchange,提问作者SiH
相关产品推荐
相关产品推荐

