如何合并两个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
修改方案
要实现共用图例和统一配色,需要做到统一颜色映射范围、统一图例名称,并合并图例显示,具体步骤如下:
计算全局数值范围
两张图的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)统一颜色映射与图例名称
为两张图的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") # 隐藏该图的图例
- 修改
合并并显示单个图例
直接合并两张图即可,此时只会显示mapplot1的图例,且配色完全统一:mapplot1 + mapplot2如果你使用
patchwork包,也可以用plot_layout(guides = 'collect')自动合并图例(无需手动隐藏某张图的图例):library(patchwork) mapplot1 + mapplot2 + plot_layout(guides = 'collect')
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

