You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 01:36:01