ggplot2多图共用填充色板求助:基于ggmap与stat_summary_hex绘图
解决ggmap叠加stat_summary_hex并共用填充色板的问题
看来你在尝试用ggmap做底图,叠加stat_summary_hex生成热力图,还想让多张图表共用同一填充色阶对吧?我帮你梳理下代码里的问题,再给出落地的优化方案:
1. 修正stat_summary_hex的映射逻辑
你代码里写了color = timediff,但stat_summary_hex的填充色是靠fill参数映射的,color实际控制的是六边形的边框颜色。另外,填充色应该对应计算后的均值结果,所以要改用stat(value)来引用统计输出:
ggmap(TAmap) + coord_cartesian() + stat_summary_hex(aes(x = stop_lon, y = stop_lat, z = timediff, fill = stat(value)), fun = mean, bins = 30, alpha = 0.55, data = Atemp)
这里把匿名函数function(x) mean(x)简化成mean,效果是一样的,代码更清爽。
2. 实现多张图表的统一色板
要让所有图表共用同一色阶,核心是固定填充色的数值范围(limits),这样不管单张图的数据波动如何,色板和数值的对应关系始终一致。
先计算所有数据集里timediff的全局范围(假设你有Atemp、Btemp等多个数据集):
# 合并所有数据计算全局极值和中点 all_data <- rbind(Atemp, Btemp, Ctemp) global_min <- min(all_data$timediff) global_max <- max(all_data$timediff) global_mid <- mean(all_data$timediff)
然后在每个图表的色阶设置里指定这个范围:
scale_fill_gradient2(low = "green", mid = "lightblue", high = "red", midpoint = global_mid, limits = c(global_min, global_max), name = "Mean Time Difference")
这样所有图表的色板就绑定到同一个数值区间了,不会出现同一种颜色在不同图里对应不同数值的情况。
3. 完整多图生成示例
如果要批量生成统一色板的图表,可以用循环或者lapply批量处理:
library(ggmap) library(ggplot2) # 假设已获取TAmap底图,准备好多个数据集 data_list <- list(Set1 = Atemp, Set2 = Btemp, Set3 = Ctemp) # 计算全局色阶范围 all_timediff <- unlist(lapply(data_list, function(df) df$timediff)) global_min <- min(all_timediff) global_max <- max(all_timediff) global_mid <- mean(all_timediff) # 批量生成图表 plot_list <- lapply(names(data_list), function(name) { df <- data_list[[name]] ggmap(TAmap) + coord_cartesian() + stat_summary_hex(aes(x = stop_lon, y = stop_lat, z = timediff, fill = stat(value)), fun = mean, bins = 30, alpha = 0.55, data = df) + scale_fill_gradient2(low = "green", mid = "lightblue", high = "red", midpoint = global_mid, limits = c(global_min, global_max), name = "Mean Time Diff") + labs(title = paste("Heatmap -", name)) }) # 查看单张图或批量保存 plot_list[[1]]
额外小提示
- 如果
coord_cartesian()是用来限制地图显示范围,可以直接在ggmap()里用extent参数,或者在coord_cartesian()里明确写xlim/ylim,可读性更强。 - 如果你的数据里有异常值,也可以把
global_min和global_max换成百分位数(比如quantile(all_timediff, c(0.025, 0.975))),避免色阶被极端值拉偏。
内容的提问来源于stack exchange,提问作者Dror Bogin
相关产品推荐
相关产品推荐

