超详细的热图绘制教程(5000余字),真正的保姆级教程
以下文章原始来源于蚂蚁生信 ,作者蚂蚁生信
直接来源R语言统计与绘图,函数解释来自医科堂。
经常会想到用热图来展示某个基因或某些基因的表达量问题,今天用R中的pheatmap
包一步步绘制热图。
如果不想写代码,在线版可以满足大部分需求,高颜值免费在线绘图工具升级版来了~~~
系统学习R见 送书《R语言数据分析和可视化》 | 这个为生信学习和生信作图打造的开源R教程真香!!!
目 录
1. 绘图前准备
1.1 设置工作目录
1.2 安装和加载R包
1.3 读取查看数据
2. 绘制热图
3. 自定义热图
3.1 热图横向标准化
3.2 图形外观调整
3.3 去除横纵坐标标签
3.4 修改图例
3.5 设置字体
3.6 调整横纵向聚类
3.7 调整分组标签角度
3.8 添加图形标题
3.9 调整热块大小
3.10 划分聚类热图区块
3.11 调整热图显示数值
3.12 标记热图区块
4. 构建分组信息
4.1 构建纵向分组信息
4.2 构建横向分组信息
4.3 共同组合二者
5. 保存图形
6. pheatmap()函数解释
1. 绘图前准备
1.1 设置工作目录
首先清除环境变量,设置工作目录,工作目录是R用来读取文件和保存结果的默认目录。
我一般是在C盘新建一个文件夹当做R的工作目录,所有的文件都复制到这里面处理。
rm(list=ls()) # 清除环境变量
setwd("C:/Rdata") # 设置工作目录
getwd() # 查看当前的工作目录
# [1] "C:/Rdata"
1.2 安装和加载R包
安装我们绘图需要用的包,如果已安装,直接加载就好了。
install.packages("pheatmap") # 安装包
install.packages("ggplot2") # 安装包
library(pheatmap) # 加载包
library(ggplot2) # 加载包
1.3 读取查看数据
演示数据不是内置数据集,如需要演示数据,请后台回复热图
即可免费获取。
data <- read.table("test.FPKM.txt", # 读取的数据文件名称,这里文件是放在工作目录下
header=T, # 数据集第一行为变量名
row.names=1, # 第一列为行名
sep="\t") # 指定分隔符号
dim(data) # 查看变量有多少行多少列
#[1] 21 9
head(data) # 查看数据集前六行
2. 绘制热图
先绘制个基本款的热图。
p <- pheatmap(data)
3. 自定义热图
3.1 热图横向标准化
设置标准化方向scale
,对其横向标准化。
p <- pheatmap(data, scale="row")
3.2 图形外观调整
设置边框为白色,去掉横向、纵向聚类。
p <- pheatmap(data, scale="row",
border="white", # 设置边框为白色
cluster_cols = F, # 去掉横向、纵向聚类
cluster_rows = F)
3.3 去除横纵坐标标签
去掉横纵坐标中的id。
p <- pheatmap(data,scale="row",
border="white", # 设置边框为白色
cluster_cols = F, # 去掉横向、纵向聚类
cluster_rows = F,
show_rownames = F, #去掉横、纵坐标id
show_colnames = F)
3.4 修改图例
3.4.1 不显示右上角图例
p <- pheatmap(data,scale="row",
border="white", # 设置边框为白色
cluster_cols = F, # 去掉横向、纵向聚类
cluster_rows = F,
show_rownames = F, #去掉横、纵坐标id
show_colnames = F,
legend = F) # 去掉图例
3.4.2 设置图例范围
p <- pheatmap(data,scale="row",
border="white", # 设置边框为白色
cluster_cols = F, # 去掉横向、纵向聚类
cluster_rows = F,
show_rownames = F, #去掉横、纵坐标id
show_colnames = F,
legend = T, # 添加图例
legend_breaks=c(-1,0,1)) # 设置图例范围
# 也可以设置legend_breaks=c(-2,0,2)试试
3.5 设置字体
3.5.1 设置图形字体大小
设置图中字的大小,使用fondsize参数来设置。
p <- pheatmap(data,scale="row",
border="white", # 设置边框为白色
cluster_cols = F, # 去掉横向、纵向聚类
cluster_rows = F,
show_rownames = T, #显示横、纵坐标id
show_colnames = T,
legend = F, # 去掉图例
fontsize = 8) # 设置字体大小
# 也可以设置其他大小试试。
3.5.2 分别指定横纵字体大小
分别指定横向和纵向字体大小,使用fontsize_row
和fontsize_col
参数设置。
p <- pheatmap(data,scale="row",
border="white", # 设置边框为白色
cluster_cols = F, # 去掉横向、纵向聚类
cluster_rows = F,
show_rownames = T, #显示横、纵坐标id
show_colnames = T,
legend = T, # 显示图例
fontsize_row = 12, # 分别设置横向和纵向字体大小
fontsize_col = 16)
3.6 调整横纵向聚类
3.6.1 调整横纵向聚类树高
分别设置横向纵向的树高,使用treeheight_col
和treeheight_row
参数设置。
p <- pheatmap(data,scale="row",
border="white", # 设置边框为白色
cluster_cols = T, # 显示横向、纵向聚类
cluster_rows = T,
treeheight_col = 50, # 分别设置横、纵向聚类树高
treeheight_row = 45)
3.6.2 调整聚类距离类型
设置聚类的距离类型,使用clustering_distance_rows
参数指定,分为如下几类:correlation,euclidean,maximum,manhattan,canberra,binary,minkowski
。
p <- pheatmap(data,scale="row",
border="white", # 设置边框为白色
cluster_cols = T, # 显示横向、纵向聚类
cluster_rows = T,
clustering_distance_rows = "correlation", # 设置聚类的距离类型
treeheight_col = 50, # 分别设置横、纵向聚类树高
treeheight_row = 45)
3.6.3 调整聚类方法
调整聚类的方法,使用clustering_method
参数指定,可选有'ward', 'ward.D', 'ward.D2', 'single', 'complete', 'average', 'mcquitty', 'median' or 'centroid'.
p <- pheatmap(data,scale="row",
border="white", # 设置边框为白色
cluster_cols = T, # 显示横向、纵向聚类
cluster_rows = T,
clustering_distance_rows = "euclidean", # 设置聚类的距离类型
clustering_method="single", # 设置聚类方法
treeheight_col = 50, # 分别设置横、纵向聚类树高
treeheight_row = 45)
3.7 调整分组标签角度
设置分组标签的角度,可以使用参数angle_col
指定,可选有270、0、45、90、315等。
p <- pheatmap(data,scale="row",
angle_col = 45, # 设置显示角度
clustering_distance_rows = "minkowski",
clustering_method="complete",
border="white",
cluster_cols = T,treeheight_col = 20,
cluster_rows = T,treeheight_row = 20)
3.8 添加图形标题
给图形增加标题,可以使用main
参数指定。
p <- pheatmap(data, scale="row", border="white",
main="Gene1", # 设置图形标题
angle_col = 0,
clustering_distance_rows = "minkowski",
clustering_method="complete",
cluster_cols = T,treeheight_col = 20,
cluster_rows = T,treeheight_row = 20)
3.9 调整热块大小
分别调整热图方块宽度和高度,可以使用cellwidth
和cellheight
参数指定。
p <- pheatmap(data, scale="row", border="white",
cellwidth = 40,cellheight = 20, # 设置热图方块宽度和高度
main="Gene1", angle_col = 0,
clustering_distance_rows = "minkowski",
clustering_method="complete",
cluster_cols = T,treeheight_col = 20,
cluster_rows = T,treeheight_row = 20)
3.10 划分聚类热图区块
根据热图聚类对其进行区块儿划分,可以使用cutree_cols
和cutree_rows
参数指定
p <- pheatmap(data,scale="row",
cutree_cols = 6, cutree_rows =5, # 列划为6块,行为5块
main="Gene1",angle_col = 0,
clustering_distance_rows = "minkowski",
clustering_method="complete",border="white",
cluster_cols = T,treeheight_col = 20,
cluster_rows = T,treeheight_row = 20)
注:此处我去掉了热图块儿的大小;cellwidth = 8,cellheight = 6
在上图基础上增加边缘线。
p <- pheatmap(data,scale="row", border="#8B0A50",
cutree_cols = 6, cutree_rows =5,
main="Gene1",angle_col = 0,
clustering_distance_rows = "minkowski",
clustering_method="complete",
cluster_cols = T,treeheight_col = 20,
cluster_rows = T,treeheight_row = 20)
3.11 调整热图显示数值
热图上是否展示数值,大小和颜色,大小以及数值展示类型,可以使用display_numbers
、fontsize_number
、number_color
、number_format
等参数设置。
3.11.1 热图上显示数值
使用display_numbers
参数指定是否显示数值。
p <- pheatmap(data,scale="row",border="#8B0A50",
display_numbers = T, # 热图上显示数值
cutree_cols = 3,cutree_rows =4,
main="Gene1",angle_col = 0,
clustering_distance_rows = "minkowski",
clustering_method="complete",
cluster_cols = T,treeheight_col = 20,
cluster_rows = T,treeheight_row = 20)
3.11.2 设置显示数值的大小
使用fontsize_number
参数指定数值的显示大小。
p <- pheatmap(data,scale="row",border="#8B0A50",
fontsize_number = 10, display_numbers = T,
cutree_cols = 3,cutree_rows =4,
main="Gene1",angle_col = 0,
clustering_distance_rows = "minkowski",
clustering_method="complete",
cluster_cols = T,treeheight_col = 20,
cluster_rows = T,treeheight_row = 20)
3.11.3 设置数值的颜色
使用number_color
参数指定数值的颜色。
p <- pheatmap(data,scale="row",border="#8B0A50",
number_color="red",
fontsize_number = 10,display_numbers = T,
cutree_cols = 3,cutree_rows =4,
main="Gene1",angle_col = 0,
clustering_distance_rows = "minkowski",
clustering_method="complete",
cluster_cols = T,treeheight_col = 20,
cluster_rows = T,treeheight_row = 20)
3.11.4 设置数值显示类型
使用number_format参数指定数值显示类型,下图显示为科学计数法。
p <- pheatmap(data,scale="row", border="#8B0A50", number_color="red",
number_format="%.2e",
fontsize_number = 10,display_numbers = T,
cutree_cols = 3,cutree_rows =4,
main="Gene1",angle_col = 0,
clustering_distance_rows = "minkowski",
clustering_method="complete",
cluster_cols = T,treeheight_col = 20,
cluster_rows = T,treeheight_row = 20)
3.12 标记热图区块
对热图方块儿进行标记;display_numbers
,如果该值大于1,则为+,否则为-。
p <- pheatmap(data,scale="row",
number_color="red",number_format="%.2e",
border="#8B0A50",
fontsize_number = 16,
display_numbers = matrix(ifelse(data > 1, "+", "-"), nrow(data)),
cutree_cols = 3,cutree_rows =4,
main="Gene1",angle_col = 0,
clustering_distance_rows = "minkowski",
clustering_method="complete",
cluster_cols = T,treeheight_col = 20,
cluster_rows = T,treeheight_row = 20)
# 也可以设置display_numbers = matrix(ifelse(data > 2, "++", "-"), nrow(data))试试
4. 构建分组信息
构建纵向和横向分组信息(有3个处理,分别是:盐、干旱和热应激);以及时间:0-3day,对3类基因21个基因进行分组,分别是:"WRKY", "AP2", "YABBY"。
4.1 构建纵向分组信息
annotation_col = data.frame(Deal_with = factor(rep(c("Salt", "Drought","Heat"), 3)),
Day=factor(rep(c("Day1", "Day2","Day3"), 3)))
rownames(annotation_col)
# [1] "1" "2" "3" "4" "5" "6" "7" "8" "9"
colnames(data)
# [1] "Q1" "Q2" "Q3" "F1" "F2" "F3" "T1" "T2" "T3"
rownames(annotation_col) <- colnames(data)
head(annotation_col)
# Deal_with Day
# Q1 Salt Day1
# Q2 Drought Day2
# Q3 Heat Day3
# F1 Salt Day1
# F2 Drought Day2
# F3 Heat Day3
pheatmap(data, annotation_col = annotation_col)
p <- pheatmap(data, scale="row",
annotation_col = annotation_col,
number_color="red",number_format="%.2e",
border="#8B0A50",fontsize_number = 8,
display_numbers = matrix(ifelse(data > 2, "++", "-"), nrow(data)),
cutree_cols = 3,cutree_rows =4,
main="Gene1",angle_col = 0,
clustering_distance_rows = "minkowski",
clustering_method="complete",
cluster_cols = T,treeheight_col = 20,
cluster_rows = T,treeheight_row = 20)
4.2 构建横向分组信息
annotation_row = data.frame(GeneClass = factor(rep(c("WRKY", "AP2", "YABBY"),7)))
rownames(annotation_row) <- rownames(data)
head(annotation_row)
# GeneClass
# Gene1 WRKY
# Gene2 AP2
# Gene3 YABBY
# Gene4 WRKY
# Gene5 AP2
# Gene6 YABBY
pheatmap(data, annotation_row =annotation_row)
p <- pheatmap(data, scale="row",
number_color="red",
annotation_row =annotation_row,
number_format="%.2e",
border="#8B0A50",
fontsize_number = 16,
display_numbers = matrix(ifelse(data > 2, "++", "-"), nrow(data)),
cutree_cols = 3,cutree_rows =4,
main="Gene1",angle_col = 0,
clustering_distance_rows = "minkowski",
clustering_method="complete",
cluster_cols = T,treeheight_col = 20,
cluster_rows = T,treeheight_row = 20)
4.3 共同组合二者
p <- pheatmap(data,
annotation_col = annotation_col,
annotation_row = annotation_row)
p <- pheatmap(data,scale="row",
number_color="red",
annotation_col = annotation_col,
annotation_row = annotation_row,
number_format="%.2e",border="#8B0A50",
fontsize_number = 15,
display_numbers = matrix(ifelse(data > 2, "++", "-"),nrow(data)),
cutree_cols = 3,cutree_rows =4,
main="Gene1",angle_col = 0,
clustering_distance_rows = "minkowski",
clustering_method="complete",
cluster_cols = T,treeheight_col = 20,
cluster_rows = T,treeheight_row = 20)
5. 保存图形
可以保存为pdf/jpeg/png格式,建议保存为pdf/jpeg,因为二者清晰度高。
p <- pheatmap(data,
annotation_col = annotation_col,
annotation_row = annotation_row,
filename = "基因家族热图.pdf",
width = 10, height = 8)
p <- pheatmap(data,
annotation_col = annotation_col,
annotation_row = annotation_row,
filename = "基因家族热图.jpeg",
width = 10,height = 8)
p <- pheatmap(data,
annotation_col = annotation_col,
annotation_row = annotation_row,
filename = "基因家族热图.png",
width = 10,height = 8)
6. pheatmap()函数
pheatmap(mat, color = colorRampPalette(rev(brewer.pal(n = 7, name =
"RdYlBu")))(100), kmeans_k = NA, breaks = NA, border_color = "grey60",
cellwidth = NA, cellheight = NA, scale = "none", cluster_rows = TRUE,
cluster_cols = TRUE, clustering_distance_rows = "euclidean",
clustering_distance_cols = "euclidean", clustering_method = "complete",
clustering_callback = identity2, cutree_rows = NA, cutree_cols = NA,
treeheight_row = ifelse((class(cluster_rows) == "hclust") || cluster_rows,
50, 0), treeheight_col = ifelse((class(cluster_cols) == "hclust") ||
cluster_cols, 50, 0), legend = TRUE, legend_breaks = NA,
legend_labels = NA, annotation_row = NA, annotation_col = NA,
annotation = NA, annotation_colors = NA, annotation_legend = TRUE,
annotation_names_row = TRUE, annotation_names_col = TRUE,
drop_levels = TRUE, show_rownames = T, show_colnames = T, main = NA,
fontsize = 10, fontsize_row = fontsize, fontsize_col = fontsize,
angle_col = c("270", "0", "45", "90", "315"), display_numbers = F,
number_format = "%.2f", number_color = "grey30", fontsize_number = 0.8
* fontsize, gaps_row = NULL, gaps_col = NULL, labels_row = NULL,
labels_col = NULL, filename = NA, width = NA, height = NA,
silent = FALSE, na_col = "#DDDDDD", ...)
## 函数解释
mat # 需要绘制热图的数字矩阵。
color # 表示颜色,赋值渐变颜色调色板colorRampPalette属性,选择"蓝,白,红"渐变,分为100个等级
# 例 color = colorRampPalette(c("navy", "white", "red"))(100)
kmeans_k # 绘制热图的行聚类数,如果是NA,那么行不会聚类。
breaks # 设置mat数值范围的数字序列
border_color # 表示热图上单元格边框的颜色,如果不绘制边框,则使用NA
cellwidth # 表示每个单元格的宽度,若选择NA则表示适应窗口
cellheight # 表示每个单元格的高度,若选择NA则表示适应窗口
scale # 表示值均一化的方向,或者按照行或列,或者没有,值可以是"row", “column” 或者"none"
cluster_rows # 表示进行行的聚类,值可以是FALSE或TRUE
cluster_cols # 表示进行列的聚类,值可以是FALSE或TRUE
clustering_distance_rows # 表示行距离度量的方法
clustering_distance_cols # 表示列距离度量的方法
clustering_method # 表示聚类方法,值可以是hclust的任何一种,
# 如"ward.D",“single”, “complete”, “average”, “mcquitty”, “median”, “centroid”, “ward.D2”
clustering_callback # 回调函数来修改聚类
cutree_rows # 基于层次聚类(使用cutree)划分行的簇数(如果未聚集行,则忽略参数)
cutree_cols # 基于层次聚类(使用cutree)划分列的簇数(如果未聚集行,则忽略参数)
treeheight_row # 行的树的高度,
treeheight_col # 列的树的高度
legend # TRUE或者FALSE,表示是否显示图例
legend_breaks # 设置图例的断点,如legend_breaks = -1:4
legend_labels # legend_breaks对应的标签例:legend_breaks = -1:4, legend_labels = c(“0”,“1e-4”, “1e-3”, “1e-2”, “1e-1”, “1”)
annotation_row # 行的分组信息,需要使用相应的行名称来匹配数据和注释中的行,注意之后颜色设置会考虑离散值还是连续值,格式要求为数据框
annotation_col # 列的分组信息,需要使用相应的列名称来匹配数据和注释中的列,格式要求为数据框
annotation_colors # 用于手动指定annotation_row和annotation_col track颜色的列表。
annotation_legend # 是否显示图例的名称。
annotation_names_row # 是否显示行注释的名称。
annotation_names_col # 是否显示列注释的名称。
show_rownames # 是否显示行名
show_colnames # 是否显示列名
main # 图的名字
fontsize # 图的字体大小
fontsize_row # 行名的字体大小,默认与图的字体大小相同
fontsize_col # 列名的字体大小,默认与图的字体大小相同
angle_col # 列标签的角度,可选择 (0, 45, 90, 270 and 315)
display_numbers # 表示是否将数值显示在热图的格子中,如果这是一个矩阵(与原始矩阵具有相同的尺寸),则显示矩阵的内容而不是原始值。
number_format # 设置显示数值的格式,较常用的有"%.2f"(保留小数点后两位),"%.1e"(科学计数法显示,保留小数点后一位)
number_color # 设置显示内容的颜色
fontsize_number # 设置显示内容的字体大小
labels_row # 代替行名的自定义标签
labels_col # 代替列名的自定义标签
filename # 图片保存位置以及文件名
width # 手动设置输出文件的宽度(单位:英寸)
height # 手动设置输出文件的高度(单位:英寸)
silent # 不绘制热图
na_col # 缺失值的颜色
本文完。
猜你喜欢
10000+:菌群分析 宝宝与猫狗 梅毒狂想曲 提DNA发Nature Cell专刊 肠道指挥大脑
文献阅读 热心肠 SemanticScholar Geenmedical
16S功能预测 PICRUSt FAPROTAX Bugbase Tax4Fun
生物科普: 肠道细菌 人体上的生命 生命大跃进 细胞暗战 人体奥秘
写在后面
为鼓励读者交流、快速解决科研困难,我们建立了“宏基因组”专业讨论群,目前己有国内外5000+ 一线科研人员加入。参与讨论,获得专业解答,欢迎分享此文至朋友圈,并扫码加主编好友带你入群,务必备注“姓名-单位-研究方向-职称/年级”。PI请明示身份,另有海内外微生物相关PI群供大佬合作交流。技术问题寻求帮助,首先阅读《如何优雅的提问》学习解决问题思路,仍未解决群内讨论,问题不私聊,帮助同行。
学习16S扩增子、宏基因组科研思路和分析实战,关注“宏基因组”