如何限制viridis颜色刻度范围?优化含异常值热力图可视化
解决Viridis色阶热力图的异常值与对比问题
当然可以实现你想要的效果!核心思路是固定颜色映射的范围为0-1.2,同时将超出这个范围的数值统一映射到色阶的最高色(Viridis的黄色),这样既保留了0-1区间内的细节差异,又能让两张图使用完全一致的色标,方便直接对比。
关键参数说明
我们需要用到scale_fill_viridis()的两个参数:
limits = c(0, 1.2):强制颜色映射的取值范围为0到1.2,和第一组数据的范围对齐oob = scales::squish:这个函数会把超出limits的数值“挤压”到边界值,也就是所有>1.2的数值都会使用色阶的最高颜色
修改后的完整代码
library(viridis) library(ggplot2) library(scales) # 加载squish函数所在的包 # 创建数据 DataSet1 <- expand.grid(x = 0:5, y = 0:5) DataSet1$z <- runif(36, 0, 1.2) DataSet2 <- expand.grid(x = 0:5, y = 0:5) DataSet2$z <- runif(36, 0, 2) # 手动添加几个明显的异常值方便测试效果 DataSet2$z[1] <- 1.8 DataSet2$z[10] <- 1.5 # 绘制第一组数据(统一加上limits,确保和第二组色标完全对齐) ggplot(DataSet1, aes(x, y, fill = z)) + geom_tile() + scale_fill_viridis(limits = c(0, 1.2)) + geom_text(aes(label = round(z, 2)), size = 2) + ggtitle("DataSet1: 0.5与0.7差异清晰") # 绘制第二组数据(添加limits和oob参数处理异常值) ggplot(DataSet2, aes(x, y, fill = z)) + geom_tile() + scale_fill_viridis(limits = c(0, 1.2), oob = scales::squish) + geom_text(aes(label = round(z, 2)), size = 2) + ggtitle("DataSet2: 0.5与0.7差异清晰,异常值显示最高色")
效果说明
- 对于DataSet2中0-1.2的数值,颜色映射和DataSet1完全一致,0.5和0.7的差异会和第一组图一样容易观察
- 所有>1.2的异常值都会显示为Viridis色阶的最高黄色,既标记了异常值的存在,又不会干扰正常区间的细节展示
- 两张图使用完全相同的色标,终于可以直接对比两组数据的分布了!
内容的提问来源于stack exchange,提问作者Martin B.
相关产品推荐
相关产品推荐

