乐于分享
好东西不私藏

元宝AI复现R语言绘制热图

元宝AI复现R语言绘制热图
任务一 热图绘制

我来用R语言(使用pheatmapComplexHeatmap包)来复现这个热图。这个图包含了分组注释、标准化表达值、颜色条和聚类树。

以下是完整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:101:3] <- data_matrix[1:101:3] + 1.5  # 前10个基因在前3个样本高表达data_matrix[11:204:6] <- data_matrix[11:204: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(-202), 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(5555), "mm"))

两种方法的选择:

  1. pheatmap方法(第3部分):更简单直接,一行代码就能生成完整热图,适合快速绘图。

  2. 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),特点在于:

  1. 正方形网格:每个单元格都是正方形。

  2. 离散化的颜色:虽然右侧有一个连续的颜色条(Color Key),但图中的色块颜色似乎被“取整”或“分箱”成了几种特定的颜色等级(深蓝、浅蓝、青、浅绿、黄绿),而不是平滑渐变。

  3. 边框:每个单元格有黑色的边框。

  4. 坐标轴: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, 01),    # 【关键步骤】将连续数值离散化(分箱),对应图中的几种特定颜色    # 这样能让颜色看起来更像原图,而不是完全的渐变    value_discrete = cut(value, breaks = c(00.10.20.30.40.50.60.70.80.91.0),                         labels = c(0.050.150.250.350.450.550.650.750.850.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(01)  ) +  # 设置坐标轴标题  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)
点分享
点收藏
点点赞
点在看