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

Complex Heatmap图例颜色位置控制及色标校准问题

解决方案:固定Complex Heatmap色标映射,确保0值为白色

问题根源

当前代码使用colorRampPalette(c("blue", "white", "red"))(100)生成颜色,会自动将每个通路数据的最小值映射到蓝色、最大值映射到红色,中间颜色线性分布。这导致不同数据范围的通路中,0值的位置不在色标中间,因此无法固定显示白色。

解决方法

使用circlize包的colorRamp2函数,手动指定颜色与数值的对应关系,强制0值对应白色,同时固定正负值的颜色渐变范围(匹配你的图例范围-4到8)。

修改后的完整代码

# 确保安装并加载circlize包(ComplexHeatmap依赖它)
if (!require(circlize)) install.packages("circlize")
library(circlize)
library(ComplexHeatmap)
library(reshape2)

# 打开PDF设备
pdf(file = "PathwayHeatmap_clustered_by_pathway1.pdf", width = 12, height = 10)

# 循环生成每个通路的热图
for (pathway in unique(combined_heatmap_data$pathway)) {
  # 提取当前通路的数据
  pathway_data <- combined_heatmap_data[combined_heatmap_data$pathway == pathway, ]
  
  # 重塑数据为矩阵格式
  pathway_zscore_matrix <- dcast(pathway_data, gene ~ comparison, value.var = "Zscore", fun.aggregate = mean)
  rownames(pathway_zscore_matrix) <- pathway_zscore_matrix$gene
  pathway_zscore_matrix <- as.matrix(pathway_zscore_matrix[, -1])  # 移除gene列

  # 基因层次聚类
  gene_cluster <- hclust(dist(pathway_zscore_matrix), method = "ward.D")
  pathway_zscore_matrix <- pathway_zscore_matrix[gene_cluster$order, ]  # 按聚类结果重排行

  # 生成热图
  heatmap_obj <- Heatmap(
    pathway_zscore_matrix,
    name = "Zscore",
    # 关键修改:用colorRamp2固定数值-4→蓝,0→白,8→红的映射
    col = colorRamp2(c(-4, 0, 8), c("blue", "white", "red")),
    show_row_names = TRUE,
    show_column_names = TRUE,
    row_dend_side = "left",
    column_dend_side = "top",
    cluster_rows = TRUE,
    cluster_columns = FALSE,  # 固定列顺序(即比较组)
    row_title = pathway,
    row_title_gp = gpar(fontface = "bold"),  # 通路名称加粗
    heatmap_legend_param = list(
      title = "Zscore",
      at = seq(-4, 8, by = 2),  # 保持图例刻度与色标范围一致
      labels = seq(-4, 8, by = 2),
      legend_side = "right"  # 图例放在右侧
    ),
    top_annotation = NULL,  # 移除顶部注释
    column_names_gp = gpar(fontface = "bold"),  # X轴标签加粗
    column_names_rot = 0  # X轴标签水平显示
  )

  # 绘制热图
  draw(heatmap_obj)
}

# 关闭PDF设备
dev.off()

额外说明

  • 如果部分通路的数据超出-4或8的范围:小于-4的数值会显示最深的蓝色,大于8的数值会显示最深的红色,不会破坏色标的整体映射规则。
  • 若需要调整极端值的颜色,可以在colorRamp2中添加更多节点,比如colorRamp2(c(-5, -4, 0, 8, 9), c("darkblue", "blue", "white", "red", "darkred")),进一步细化颜色渐变。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 13:26:03