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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 02:27:33