生物信息学习的正确姿势 NGS系列文章包括NGS基础、高颜值在线绘图和分析、转录组分析 (Nature重磅综述|关于RNA-seq你想知道的全在这)、ChIP-seq分析 (ChIP-seq基本分析流程)、单细胞测序分析 (重磅综述:三万字长文读懂单细胞RNA测序分析的最佳实践教程)、DNA甲基化分析、重测序分析、GEO数据挖掘(典型医学设计实验GEO数据分析 (step-by-step))、批次效应处理等内容。 以下文章原始来源于蚂蚁生信 ,作者蚂蚁生信 直接来源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 9head(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)
添加fpkm至热图方块儿内 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 # 表示热图上单元格边框的颜色,如果不绘制边框,则使用NAcellwidth # 表示每个单元格的宽度,若选择NA则表示适应窗口cellheight # 表示每个单元格的高度,若选择NA则表示适应窗口scale # 表示值均一化的方向,或者按照行或列,或者没有,值可以是'row', “column” 或者'none'cluster_rows # 表示进行行的聚类,值可以是FALSE或TRUEcluster_cols # 表示进行列的聚类,值可以是FALSE或TRUEclustering_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:4legend_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 # 缺失值的颜色
本文完。
|