

我来用R语言(使用pheatmap和ComplexHeatmap包)来复现这个热图。这个图包含了分组注释、标准化表达值、颜色条和聚类树。
以下是完整R代码:
# 安装和加载必要的包if (!require("pheatmap")) install.packages("pheatmap")if (!require("ComplexHeatmap")) {if (!require("BiocManager")) install.packages("BiocManager")BiocManager::install("ComplexHeatmap")}if (!require("circlize")) install.packages("circlize")if (!require("dendextend")) install.packages("dendextend")library(pheatmap)library(ComplexHeatmap)library(circlize)library(dendextend)# 1. 创建模拟数据(类似于原图)set.seed(123)# 创建30个特征(行),6个样本(列)的数据矩阵data_matrix <- matrix(rnorm(30 * 6, mean = 0, sd = 1), nrow = 30, ncol = 6)# 添加一些聚类模式,让某些基因在某些样本中高表达data_matrix[1:10, 1:3] <- data_matrix[1:10, 1:3] + 1.5 # 前10个基因在前3个样本高表达data_matrix[11:20, 4:6] <- data_matrix[11:20, 4:6] + 1.5 # 中间10个基因在后3个样本高表达data_matrix[21:30, c(1,3,5)] <- data_matrix[21:30, c(1,3,5)] - 1.5 # 后10个基因在特定样本低表达# 设置行列名称rownames(data_matrix) <- paste0("Gene_", sprintf("%02d", 1:30))colnames(data_matrix) <- paste0("Sample", 1:6)# 2. 创建分组注释(顶部注释条)# 原图有Group和Type两个分组annotation_df <- data.frame(Group = factor(c(rep("Group1", 3), rep("Group2", 3))),Type = factor(rep(c("TypeA", "TypeB"), each = 3)))rownames(annotation_df) <- colnames(data_matrix)# 3. 使用pheatmap绘制(更简单)# 绘制标准化后的热图(z-score标准化,按行)pheatmap_result <- pheatmap(data_matrix,scale = "row", # 按行标准化(z-score),这是原图的做法color = colorRampPalette(c("blue", "white", "red"))(100), # 蓝-白-红渐变色cluster_rows = TRUE, # 对行聚类cluster_cols = TRUE, # 对列聚类show_rownames = TRUE, # 显示行名show_colnames = TRUE, # 显示列名annotation_col = annotation_df, # 列注释annotation_colors = list(Group = c(Group1 = "darkorange", Group2 = "darkgreen"),Type = c(TypeA = "skyblue", TypeB = "pink")),main = "Clustered Heatmap", # 主标题fontsize_row = 8, # 行名字体大小fontsize_col = 10, # 列名字体大小border_color = NA, # 无边框treeheight_row = 20, # 行聚类树高度treeheight_col = 20 # 列聚类树高度)# 4. 使用ComplexHeatmap绘制(更灵活,更接近原图)# 定义颜色映射函数col_fun <- colorRamp2(c(-2, 0, 2), c("blue", "white", "red"))# 创建顶部注释top_annotation <- HeatmapAnnotation(df = annotation_df,col = list(Group = c("Group1" = "darkorange", "Group2" = "darkgreen"),Type = c("TypeA" = "skyblue", "TypeB" = "pink")),annotation_name_side = "left",annotation_legend_param = list(title_gp = gpar(fontsize = 10, fontface = "bold"),labels_gp = gpar(fontsize = 9)))# 创建热图主体ht <- Heatmap(scale(data_matrix), # 按行标准化name = "Expression", # 图例标题col = col_fun, # 颜色映射top_annotation = top_annotation, # 顶部注释# 聚类设置cluster_rows = TRUE,cluster_columns = TRUE,show_column_dend = TRUE,show_row_dend = TRUE,# 行列名称row_names_side = "left",show_row_names = TRUE,row_names_gp = gpar(fontsize = 8),column_names_side = "bottom",show_column_names = TRUE,column_names_gp = gpar(fontsize = 10),# 图例heatmap_legend_param = list(title = "Z-score",title_position = "leftcenter-rot",legend_height = unit(4, "cm"),title_gp = gpar(fontsize = 10, fontface = "bold"),labels_gp = gpar(fontsize = 9)),# 热图外观column_title = "Clustered Heatmap",column_title_gp = gpar(fontsize = 12, fontface = "bold"),rect_gp = gpar(col = NA), # 无单元格边框# 聚类树外观row_dend_width = unit(2, "cm"),column_dend_height = unit(2, "cm"))# 绘制ComplexHeatmap版本draw(ht, padding = unit(c(5, 5, 5, 5), "mm"))
两种方法的选择:
pheatmap方法(第3部分):更简单直接,一行代码就能生成完整热图,适合快速绘图。ComplexHeatmap方法(第4部分):更灵活强大,可以精细控制每个元素,更接近原图效果。
关键参数说明:
scale = "row":对每行(基因)进行z-score标准化,这是热图的常见做法colorRampPalette(c("blue", "white", "red"))(100):创建蓝-白-红渐变色cluster_rows/cluster_columns:控制行列聚类annotation_col:添加列注释(样本分组)show_rownames/show_colnames:控制是否显示行列名border_color = NA:去除热图单元格边框,使图更清晰


这张图是一个方形热图(Square Heatmap),特点在于:
正方形网格:每个单元格都是正方形。
离散化的颜色:虽然右侧有一个连续的颜色条(Color Key),但图中的色块颜色似乎被“取整”或“分箱”成了几种特定的颜色等级(深蓝、浅蓝、青、浅绿、黄绿),而不是平滑渐变。
边框:每个单元格有黑色的边框。
坐标轴:X轴和Y轴的刻度标签是离散的整数。
这里有两种画法:
方法一(推荐):使用
ggplot2配合geom_tile(),这是目前最灵活、最美观的做法。我们需要先构造一个带有“等级”的数据框。方法二:使用 Base R 的
image()或heatmap()函数,但对这种带边框和离散颜色的调整比较麻烦。
下面我为你提供方法一(ggplot2)的完整代码,因为它最能完美复刻这种效果。
R 代码实现
library(ggplot2)library(dplyr)# 1. 生成模拟数据set.seed(42) # 设定随机种子,保证结果可复现# 创建一个 10x10 的矩阵数据n <- 10data <- expand.grid(K = 1:n, # X轴:K (w)Samples = 1:n # Y轴:Samples) %>%mutate(# 生成随机数值,范围在 0 到 1 之间value = runif(n() * n, 0, 1),# 【关键步骤】将连续数值离散化(分箱),对应图中的几种特定颜色# 这样能让颜色看起来更像原图,而不是完全的渐变value_discrete = cut(value, breaks = c(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0),labels = c(0.05, 0.15, 0.25, 0.35, 0.45, 0.55, 0.65, 0.75, 0.85, 0.95),include.lowest = TRUE))# 2. 定义颜色梯度(模仿原图:深蓝 -> 蓝 -> 青 -> 浅绿 -> 黄绿)# 提取颜色条上的断点对应的颜色color_palette <- scales::gradient_n_pal(c("#00008B", "#4169E1", "#00BFFF", "#90EE90", "#FFFFE0"))(seq(0, 1, length.out = 10))# 3. 绘图p <- ggplot(data, aes(x = K, y = Samples, fill = value)) +# 使用 geom_tile 绘制方格geom_tile(width = 0.9, height = 0.9, color = "black", size = 0.5) +# 填充颜色映射scale_fill_gradientn(colors = color_palette,breaks = seq(0, 1, by = 0.1), # 刻度间隔limits = c(0, 1)) +# 设置坐标轴标题labs(x = "K (w)", y = "Samples", title = "Square Heatmap Plot") +# 主题调整theme_minimal() +theme(plot.title = element_text(hjust = 0.5, face = "bold", size = 16),axis.text = element_text(size = 12),axis.title = element_text(size = 14),panel.grid = element_blank(), # 去掉网格线legend.position = "right")# 4. 显示图形print(p)





夜雨聆风