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

如何限制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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:19:08