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

如何仅为pheatmap热图非0值着色,将0值保留为白色?

问题

现有如下DataFrame:

gene1 gene2 gene3
leukocyte activation involved in immune response    0     0    0.5
cell activation involved in immune response         0    -1      2
alpha-beta T cell activation                       0.3     1      0
alpha-beta T cell differentiation                   0   -0.8   -0.2
positive regulation of cytokine production         1.7     0     -1
leukocyte differentiation                           0     0      1

需求是仅对非0值着色,0值保留白色。当前使用的代码如下:

my_col <- colorRampPalette(c("blue", "white", "red"))(101)  

pheatmap(df, 
         cluster_rows = TRUE,  
         cluster_cols = TRUE, 
         fontsize_row = 8,     
         fontsize_col = 8,
         color = my_col)

但该代码会将0值纳入颜色刻度,不符合需求,如何解决?

解决方案

方法一:将0替换为NA并指定NA颜色

这是最直接的实现方式,把0值转为NA后,用na_col参数设置NA显示为白色,颜色刻度会自动忽略NA值(即原0值):

# 复制数据并替换0为NA
df_na <- df
df_na[df_na == 0] <- NA

# 生成蓝-白-红渐变颜色
my_col <- colorRampPalette(c("blue", "white", "red"))(101)

# 绘制热图
pheatmap(df_na, 
         cluster_rows = TRUE,  
         cluster_cols = TRUE, 
         fontsize_row = 8,     
         fontsize_col = 8,
         color = my_col,
         na_col = "white")

方法二:自定义颜色断点

通过精准设置breaks参数,让0值对应白色,同时颜色刻度仅覆盖非0值的范围:

# 获取非0值的极值
min_nonzero <- min(df[df != 0])
max_nonzero <- max(df[df != 0])

# 生成渐变颜色
my_col <- colorRampPalette(c("blue", "white", "red"))(101)

# 创建包含0的断点序列
breaks <- seq(min_nonzero, max_nonzero, length.out = 101)
# 确保0在断点中(若原序列未包含)
if (!0 %in% breaks) {
  breaks <- c(breaks[breaks < 0], 0, breaks[breaks > 0])
  my_col <- colorRampPalette(c("blue", "white", "red"))(length(breaks))
}

# 绘制热图
pheatmap(df, 
         cluster_rows = TRUE,  
         cluster_cols = TRUE, 
         fontsize_row = 8,     
         fontsize_col = 8,
         color = my_col,
         breaks = breaks)

内容的提问来源于stack exchange,提问作者jonny jeep

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 08:35:37