如何在R中用cartogram_ncont()生成同底层比例尺的多幅非连续cartogram
解决方案
第一步:确定全局缩放基准
遍历全数据集所有政党的所有选区得票数据,提取最大值global_max_vote,这个值对应的选区就是你要的统一锚定选区,在所有cartogram中该选区的缩放比例恒为1,不会被缩小。第二步:手动统一缩放权重,绕开函数默认的单图归一化逻辑
cartogram_ncont()默认会对输入的权重列做单图的min-max归一化,这就是不同地图比例尺不一致的核心原因。你需要手动生成基于全局最大值的权重列,不让函数单独做归一化,示例代码如下:# 计算全局最大得票作为基准 global_max <- max(c(df$party1_vote, df$party2_vote, df$party3_vote)) # 替换为你所有政党的得票列 # 为每个政党生成cartogram party_list <- c("party1", "party2", "party3") # 替换为你的政党列表 cartogram_list <- list() for (p in party_list) { # 生成统一基准的权重列,加极小兜底值避免0得票选区完全消失 df[[paste0(p, "_weight")]] <- df[[paste0(p, "_vote")]] / global_max + 1e-6 # 生成cartogram,k参数保持默认即可 cartogram_list[[p]] <- cartogram_ncont(df, weight = paste0(p, "_weight")) }第三步:固定绘图坐标范围保证跨图对比准确性
绘制所有cartogram时,统一设置相同的x轴、y轴范围,避免绘图工具自动适配坐标导致的视觉大小偏差:# 提取全局坐标范围 all_geoms <- do.call(rbind, cartogram_list) x_range <- st_bbox(all_geoms)[c("xmin", "xmax")] y_range <- st_bbox(all_geoms)[c("ymin", "ymax")] # 单图绘图时加入统一坐标限制 ggplot(cartogram_list[["party1"]]) + geom_sf(fill = "对应政党颜色代码") + xlim(x_range) + ylim(y_range) + theme_void()关于
k参数的说明k参数的作用是设置需要调整面积的选区数量,默认值为选区总数量,即所有选区都会按权重缩放,和缩放比例尺没有关系,你不需要修改该参数即可实现统一比例尺的需求。
内容的提问来源于stack exchange,提问作者Dendron
相关产品推荐
相关产品推荐

