利用pheatmap制作热图
利用pheatmap制作热图
February 26, 2025
这篇文章描述了如何合并来自不同实验的多个值以创建热图的方法。
以下步骤展示了如何从 Excel 文件中读取数据,将其合并并用于制作美观的热图。
准备 R 包
需要以下 R 包:
- readxl 和 writexl 用于输入/输出数据
- dplyr 和 scales 用于处理数据
- pheatmap、ggplot2 和 tidyverse 用于绘图
library(readxl)
library(writexl)
library(scales)
library(pheatmap)
library(ggplot2)
library(tidyverse)数据处理
设置输入文件或文件夹路径
input_file_path = "./serum_dataset/vaccine serum samples-wt delta omi.xlsx"
input_folder_path = "./serum_dataset"
# 替换为您的文件或文件夹路径通常,我会将图表导出到与输入文件相同的文件夹中:
outputpath = paste0(dirname(input_file_path),"\\heatmap.pdf") 此 outputpath 将命名为 “heatmap.pdf”,并保存在与输入文件相同的文件夹中:
[1] "./serum_dataset\\heatmap.pdf"如果选择文件夹路径作为输入,则 outputpath 应与 input_folder_path 相同:
outputpath = input_folder_path
outputpath读取数据
确保您的 Excel 文件中的数据格式如下所示:
| sample | WT-1 | WT-2 | WT-3 | WT-4 | WT-5 | WT-6 | WT-7 | WT-8 | WT-9 | Delta-1 | Delta-2 | Delta-3 | Delta-4 | Delta-5 | Delta-6 | Delta-7 | Delta-8 | Delta-9 | Omicron-1 | Omicron-2 | Omicron-3 | Omicron-4 | Omicron-5 | Omicron-6 | Omicron-7 | Omicron-8 | Omicron-9 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 249 | 3490 | 3566 | 3701 | 3823 | 3796 | 3779 | 4106 | 6278 | 11691 | 2318 | 2265 | 2270 | 2361 | 2399 | 2625 | 4045 | 19085 | 42810 | 2688 | 2691 | 2608 | 2743 | 2742 | 2697 | 2756 | 3168 | 10036 |
| NA | 3236 | 3265 | 3310 | 3453 | 3100 | 2996 | 3179 | 10101 | 17397 | 2160 | 2154 | 2158 | 2899 | 2047 | 2424 | 6343 | 10983 | 41618 | 2550 | 2473 | 2521 | 2474 | 2317 | 2331 | 2356 | 3451 | 7322 |
| 230 | 2384 | 2528 | 2675 | 2620 | 2673 | 2764 | 4490 | 10318 | 18427 | 1879 | 2515 | 1857 | 1938 | 2726 | 4257 | 12521 | 23052 | 57013 | 2255 | 2264 | 2126 | 2276 | 2062 | 2187 | 2262 | 2363 | 5507 |
| NA | 2394 | 2296 | 2315 | 2243 | 2376 | 3073 | 5018 | 14496 | 18438 | 1852 | 1869 | 1849 | 1792 | 1907 | 4469 | 16023 | 23121 | 29738 | 2121 | 2088 | 2464 | 2183 | 2036 | 1983 | 1931 | 2320 | 4665 |
| 244 | 1958 | 1936 | 2026 | 2005 | 1976 | 2474 | 2137 | 4656 | 11394 | 1698 | 2007 | 1678 | 1796 | 1647 | 1795 | 3571 | 9030 | 30330 | 2038 | 1889 | 2044 | 1917 | 1911 | 2243 | 2243 | 2969 | 6628 |
| NA | 1832 | 1921 | 1920 | 1790 | 1854 | 1996 | 2062 | 3999 | 10572 | 1703 | 1662 | 1543 | 1523 | 1683 | 3228 | 3715 | 7058 | 20046 | 1858 | 1881 | 1799 | 1760 | 1749 | 1736 | 1984 | 2797 | 8719 |
Sample 列将用作合并数据的关键列。
如果您的数据格式与上述示例匹配,可以通过以下命令读取数据:
- 如果您的数据存储在不同的 Excel 文件中,并且每个文件仅包含 一个 工作表:
file_names <- list.files(input_folder_path, pattern = "\\.xlsx$|\\.xls$", full.names = TRUE)
merged.data = list()
for (i in 1:length(file_names)) {
# 读取 Excel 文件中的数据
data <- read_excel(file_names[i])
colnames(data)[1] = "sample"
# 合并数据
merged.data[[i]] = data
}
merged_df = merged.data[[1]]让我们看一下输出的 merged_df:
这是一个数据框:
class(merged_df)
[1] "tbl_df" "tbl" "data.frame"数据处理
此 merged_df 将作为输入进行进一步处理,包括 合并批次、去除 NA 值 和 标准化。
合并批次 和 去除 NA 值
[1] "sample" "WT-1" "WT-2" "WT-3" "WT-4" "WT-5"
[7] "WT-6" "WT-7" "WT-8" "WT-9" "Delta-1" "Delta-2"
[13] "Delta-3" "Delta-4" "Delta-5" "Delta-6" "Delta-7" "Delta-8"
[19] "Delta-9" "Omicron-1" "Omicron-2" "Omicron-3" "Omicron-4" "Omicron-5"
[25] "Omicron-6" "Omicron-7" "Omicron-8" "Omicron-9"使用 Z-score 进行标准化
Z-score通常用于标准化。这里是其定义的详细解释。简单来说,我们使用公式 (x-μ)/σ 分别计算 Binding、Neutralization、ADE 和 Competition ELISA 实验的 Z-score。
output.data = merged_df %>% na.omit()
rownames(output.data) = output.data$sample
output.data$sample = NULL查看 output.data:
| WT-1 | WT-2 | WT-3 | WT-4 | WT-5 | WT-6 | WT-7 | WT-8 | WT-9 |
|---|---|---|---|---|---|---|---|---|
| 3490 | 3566 | 3701 | 3823 | 3796 | 3779 | 4106 | 6278 | 11691 |
| 2384 | 2528 | 2675 | 2620 | 2673 | 2764 | 4490 | 10318 | 18427 |
创建热图
现在您已经准备好数据来制作热图,但仍需完成一些设置。
注释列和行
注意,列注释必须与 output.data 中的顺序匹配。
因此,您可能需要仔细检查 output.data 的排列方式:
colnames(output.data)
[1] "WT-1" "WT-2" "WT-3" "WT-4" "WT-5" "WT-6"
[7] "WT-7" "WT-8" "WT-9" "Delta-1" "Delta-2" "Delta-3"
[13] "Delta-4" "Delta-5" "Delta-6" "Delta-7" "Delta-8" "Delta-9"
[19] "Omicron-1" "Omicron-2" "Omicron-3" "Omicron-4" "Omicron-5" "Omicron-6"
[25] "Omicron-7" "Omicron-8" "Omicron-9"现在,您可以按照以下命令设置注释:
annotation_col= data.frame(Datatype = factor(rep(c("WT","Delta","omi"),c(9,9,9))))
rownames(annotation_col) = colnames(output.data)
ann_colors = list(Datatype = c(WT="#3567E5",Delta="#B0E65E",omi="#91726B"))设置图例分段
break 参数对热图的输出格式非常重要,因为它决定了数据在特定范围内的代表颜色。这里我们使用一个 bk 因子来设置它。
bk = seq(-2,5,by = 1)绘制热图
最后,我们到达了这一步:
# 热图
p1 <- pheatmap(output.data, # 您准备好的数据
color = c(colorRampPalette(c('#C6DAF1','white','red'),bias = 1.7)(6)),
# 设置颜色,这里我在浅蓝色和红色之间设置了 6 种颜色
border_color = "black", # 设置边框颜色,NA 表示无边框
scale= "none",
# "column" 表示对每列进行 Z-score 标准化,
# "row" 表示对每行进行 Z-score 标准化,
# "none" 表示不进行标准化,
# 我们选择 "none",因为之前已经完成了标准化。
cluster_rows = TRUE, # 是否按行聚类
cluster_cols = FALSE, # 是否按列聚类
legend = TRUE, # 是否显示图例
breaks = bk, # 设置分段
legend_breaks = c(-2:5), # 设置图例分段
legend_labels = c(-2:5), # 设置图例分段的标签
show_rownames = FALSE,
show_colnames = FALSE,
display_numbers = FALSE,
fontsize = 10, # 设置字体大小
annotation_col =annotation_col,
annotation_colors = ann_colors,
angle_col = 0,
cutree_rows=4, # 按聚类结果分割热图
)
我们完成了!现在享受您的热图吧!
保存热图
ggsave(file = outputpath, plot = p1,width = 11,height = 10,dpi = 300)🤖
AI 使用声明:本文由作者撰写,AI 工具(Claude)辅助完成初稿起草、中英互译与格式整理。作者已审校全部内容,并对准确性承担最终责任。
最后更新于