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

如何合并两个ggplot地图并共用一个图例与配色方案?

问题:如何让两张ggplot地图共用图例与统一配色方案

我已经创建并合并了两张ggplot地图,分别展示1998-2020年实际GDP_pdiff数据和2021-2040年预测GDP_pdiff数据,现在想让两张图共用一个图例且使用相同配色方案,需要做哪些修改?

原绘图代码:

# 绘制1998-2020年实际数据地图
mapplot_temp = ggplot(map_preds20, aes(x = long, y = lat, group = group)) +
 geom_polygon(aes(fill = GDP_pdiff), colour = "black")
mapplot1 = mapplot_temp + scale_fill_gradient(name = 'GDP per capita change %', low = 
'red', high = 'yellow', na.value = 'grey') +
  theme_bw() +
  theme(panel.border = element_blank(),
    panel.grid = element_blank(),
    axis.text.x = element_blank(),
    axis.text.y = element_blank(),
    axis.title.x = element_blank(),
    axis.title.y = element_blank(),
    axis.ticks = element_blank(),
    plot.title = element_text(hjust = 0.5, size = 20, face = "bold"))

# 绘制2021-2040年预测数据地图
mapplot_temp2 = ggplot(map_preds40, aes(x = long, y = lat, group = group)) +
  geom_polygon(aes(fill = GDP_pdiff), colour = "black")
mapplot2 = mapplot_temp2 + scale_fill_gradient(name = 'GDP per capita change % ($)', low = 'red', high = 'yellow', na.value = 'grey') +
  ggtitle('Predicted GDP per capita change') +
  theme_bw() +
  theme(panel.border = element_blank(),
    panel.grid = element_blank(),
    axis.text.x = element_blank(),
    axis.text.y = element_blank(),
    axis.title.x = element_blank(),
    axis.title.y = element_blank(),
    axis.ticks = element_blank(),
    plot.title = element_text(hjust = 0.5, size = 20, face = "bold"))

# 合并两张图
mapplot1 + mapplot2

修改方案

要实现共用图例和统一配色,需要做到统一颜色映射范围、统一图例名称,并合并图例显示,具体步骤如下:

  1. 计算全局数值范围
    两张图的GDP_pdiff数值范围可能不同,直接用各自的范围会导致颜色对应的数据值不一致。先计算两个数据集的全局最小/最大值:

    # 计算GDP_pdiff的全局范围(忽略NA值)
    global_min <- min(c(map_preds20$GDP_pdiff, map_preds40$GDP_pdiff), na.rm = TRUE)
    global_max <- max(c(map_preds20$GDP_pdiff, map_preds40$GDP_pdiff), na.rm = TRUE)
    
  2. 统一颜色映射与图例名称
    为两张图的scale_fill_gradient指定相同的limits(全局范围)和图例名称,确保配色逻辑完全一致:

    • 修改mapplot1的颜色刻度:
      mapplot1 = mapplot_temp + 
        scale_fill_gradient(
          name = '人均GDP变化率(%)',  # 统一图例名称
          low = 'red', 
          high = 'yellow', 
          na.value = 'grey',
          limits = c(global_min, global_max)  # 绑定全局数值范围
        ) +
        ggtitle('1998-2020年实际人均GDP变化') +  # 补充实际数据的标题
        theme_bw() +
        theme(panel.border = element_blank(),
              panel.grid = element_blank(),
              axis.text.x = element_blank(),
              axis.text.y = element_blank(),
              axis.title.x = element_blank(),
              axis.title.y = element_blank(),
              axis.ticks = element_blank(),
              plot.title = element_text(hjust = 0.5, size = 20, face = "bold"))
      
    • 修改mapplot2的颜色刻度(统一名称和范围,暂时隐藏图例):
      mapplot2 = mapplot_temp2 + 
        scale_fill_gradient(
          name = '人均GDP变化率(%)',  # 和mapplot1保持一致
          low = 'red', 
          high = 'yellow', 
          na.value = 'grey',
          limits = c(global_min, global_max)
        ) +
        ggtitle('2021-2040年预测人均GDP变化') +
        theme_bw() +
        theme(panel.border = element_blank(),
              panel.grid = element_blank(),
              axis.text.x = element_blank(),
              axis.text.y = element_blank(),
              axis.title.x = element_blank(),
              axis.title.y = element_blank(),
              axis.ticks = element_blank(),
              plot.title = element_text(hjust = 0.5, size = 20, face = "bold"),
              legend.position = "none")  # 隐藏该图的图例
      
  3. 合并并显示单个图例
    直接合并两张图即可,此时只会显示mapplot1的图例,且配色完全统一:

    mapplot1 + mapplot2
    

    如果你使用patchwork包,也可以用plot_layout(guides = 'collect')自动合并图例(无需手动隐藏某张图的图例):

    library(patchwork)
    mapplot1 + mapplot2 + plot_layout(guides = 'collect')
    

内容的提问来源于stack exchange,提问作者Joe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 20:10:32