如何仅为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
相关产品推荐
相关产品推荐

