使用dplyr过滤数据生成多图时如何统一填充刻度范围?
统一热力图Fill刻度范围的解决方法
问题根源是每个热力图仅使用对应lag的子集数据,ggplot会自动根据子集的ccf值范围生成颜色刻度,导致各图刻度无法统一。解决核心是基于全局数据集的ccf极值设置统一的颜色范围,具体操作如下:
- 先计算整个
dat数据中ccf的全局最大、最小值:
ccf_min <- min(dat$ccf) ccf_max <- max(dat$ccf)
- 在绘制每个ggplot时,通过
scale_fill_continuous()指定统一的limits参数,强制所有图使用相同的颜色刻度范围。
修改后的完整代码:
library(purrr) library(tidyverse) set.seed(123) # 设置随机种子保证结果可复现 test <- data.frame(`1` = rpois(10,3),`2`=rpois(10,3), `3` = rpois(10,3)) ccf.func <- function(i,j){ dat <- ccf(test[i],test[j],plot=FALSE,type="correlation") ccf.dat <- data.frame(ccf=dat$acf,lag=dat$lag,first=i,second=j) return(ccf.dat) } dat <- map_dfr(1:3, function(i) map_dfr(1:3, function(j) ccf.func(i,j))) # 计算全局ccf的极值 ccf_min <- min(dat$ccf) ccf_max <- max(dat$ccf) # 生成统一刻度的热力图列表 plot_list <- lapply(0:2, function(i) ggplot(dat |> filter(lag == i)) + geom_tile(aes(x=first,y=second,fill=ccf)) + # 指定统一的颜色范围 scale_fill_continuous(limits = c(ccf_min, ccf_max), # 可选:添加颜色渐变提升可读性,比如蓝到红 low = "blue", high = "red") + labs(title = paste("Lag =", i)) ) # 可选:用gridExtra包拼接查看所有图 # library(gridExtra) # grid.arrange(grobs = plot_list, ncol=3)
关键说明
scale_fill_continuous(limits = c(ccf_min, ccf_max))是核心:强制所有热力图的颜色映射范围和全局ccf极值保持一致,不同lag的图之间可直接对比ccf大小。- 也可以用
scale_fill_gradient2设置中间色(比如0值对应白色),更适配相关系数的可视化场景。
内容的提问来源于stack exchange,提问作者SCDCE
相关产品推荐
相关产品推荐

