热图Heatmap,也叫热力图,可以用颜色变化来反映二维矩阵或表格中的数据信息,可以直观地将数据值的大小以定义的颜色深浅表示出来。热图使复杂的数据可视化和一目了然。通常根据需要将数据进行物种或样品间丰度相似性聚类,将聚类后数据表示在热图上,可将高丰度和低丰度的物种分块聚集,通过颜色梯度及相似程度来反映多个样品在各分类水平上群落组成的相似性和差异性。结果可有彩虹色和黑红色两种选择。
热图有两类:集群热图(clusterheatmap)和空间热图(spatialheatmap)。在集群热图里,图片大小固定在单元格里,制定成一个包含行和列的矩阵。单元格大小是可任意调节。而在空间热图里,在一个空间里大小和位置都固定好的。
热图的生成原理可以这样概括,先为离散点设定一个半径,创建一个缓冲区;再对每个离散点的缓冲区,使用渐进的灰度带(完整的灰度带是0-255),从内至外、从浅至深填充;因为灰度值可以叠加,数值越大则颜色越深,在灰度带中显得越白。实际上可选择ARGB模型中任一通道作为叠加灰度值,从而对于有缓冲区交叉的区域,可叠加灰度值,因而缓冲区交叉的越多,灰度值越大,这块区域越“热”。最后,用叠加后的灰度值为索引,从一条有256色的色带中映射颜色,并对颜色重新着色,从而实现热图。
灰度带
彩色带
二、热图的历史
热图其实并不是一种新的概念,可以追溯到19世纪。热图起源于数据矩阵中二维数值的显示。较大的数值用较小的深灰色或黑色方块(像素)表示。在1873年Lona就使用了阴影矩阵将巴黎各区的社会上统计数据实现了可视化。在1957年Sneath展示了聚类分析的结果,通过对矩阵的行和列进行置换,根据聚类将相似数值放置在彼此的附近。之后JacquesBertin使用了类似方法显示出符合格特曼尺度的数据,他将集群树连接到数据矩阵的行和列,这一想法来自于1973年RobertLing。RobertLing使用了打印机的字符来表示不同灰度,即一个像素就有一个字符宽度。在1994年LelandWilkinson开发了第一个计算机程序(SYSTAT),用于制作高分辨率彩色图形的集群热图。在1991年,软件设计师CormacKinney注册了“heatmap”商标,发明了一种用2D图形显示实时金融市场信息的工具。如今,热图仍然可以手工形式、Excel电子表格或使用像Hotjar这样的专业软件创建。
三、热图的类型
热图大致上可分为四种类型:
生物学热图,通常用在分子生物学范畴,可以显示从DNA微阵列获得的大量可比较样本(不同状态下的细胞、不同患者的样本)中的很多基因的表达水平。
树形图,是数据的2D分层分区,在视觉上类似于热图。
马赛克图,是一种平铺热图,用于表示双向或更高方式的数据表,与树形图一样,镶嵌在图中的矩形区域是分层组成。意味着这些区域是矩形。
密度函数可视化图,用来表示出图中点密度的热图,使人们能够独立在变焦参数感知点的密度。在2015年Perrot等人提出的一种方法,通过使用Spark和Hadoop等大数据基础设备,利用密度函数可看到几十亿个点。
四、热图在各个领域内的用途
热图通过众多数据点信息,汇聚成直观可视化颜色效果,至今热图被广泛应用在不同领域和范畴,比如气象预报、医疗成像、机房温度等,甚至应用于竞技体育领域的数据分析。
一场世界杯足球竞赛——评委们通常利用热图了解到冠军队伍中门将、后卫、中场和前锋的跑位,让我们一目了然地看到多名球员在比赛中跑位的差异。
天气、地震预测——气象局还可利用热图判断地震震源位置,可清楚看出哪些地方是地震高发区(频率最高)。
经济学上——结合百度地图和热图,就可利用热图看到金融商圈,将商家的坐标采集下来,根据坐标点进行聚类。看下面这张图,红色表示商家较多的地方,我们就可知道哪些是金融商圈。
那么,在生物学领域上热图提供什么用处呢?
在生物学上,尤其是分子生物学和生物信息学领域,热图经常用于展示多个基因在不同样本的表达水平,通过聚类等方式查看实验组和对照组特有的方式。
如上图所示,每一列代表一个样本,每一行代表一个基因,颜色代表表达量(这张图的图例看出,颜色越偏红色,数值越大,基因表达量越高)。
五、热图的可视化方式
为什么要进行数据可视化呢?相对于文字说明,将文字进行可视化可让大脑能同时处理更多的数据。而且,可视化能使传递的信息更清晰。当我们进行数据可视化的时候,我们可以看到一些用文字无法看到的信息。如果只用文字表示,我们只能看到一大堆冷冰冰的数字,很难找到当中的规律。如果善用数据图就发现出这对数据的变化趋势。
热图在生信分析中可实现可视化数据。我们当然用R包了,R包默认了heatmap函数。R包也有很多具备heatmap功能的包,比如ggplot函数、pheatmap、ComplexHeatmap包、heatmap.plus包把数据实现出来。绘制热图的软件或方法有很多,如Excel、R语言、html、Python、MATLAB等。
heatmap():用于绘制简单热图的函数
heatmap.2():绘制增强热图的函数
ComplexHeatmap:用于绘制、注释和排列复杂热图的R&bioconductor包(非常适用于基因组数据分析)
heatmap.2函数和我们之前要求的数据类型不太一样,这个函数输入数据要求是矩阵。
data(mtcars)x<-mtcarsy<-as.matrix(mtcars)
在RStudio中我们可以清楚的看到x和y的区别,x的type是dataframe的格式,而y是matrix也就是矩阵格式。这两种数据类型有什么差别呢?matrix中的值只能是一个格式,比如都是字符型。而dataframe可以同时支持不同的类型比如数值型和字符型。
在开始作图之前,首先得安装好R包。此R包可在Win10、MacOSX、Linux操作系统上运行。
R包下载完成后,点击运行”R-3.X-win.exe“这个程序包。
接下来,就是要安装RStudio。它包括一个支持直接代码执行的控制台,以及用于在工作区中绘制和跟踪变量的工具。它安装起来很简单,可到RStudio网页上下载即可。下载完成后,点击并运行“RStudio-1.2.XXXX.exe”。这里要注意的是,必须先安装R包,RStudio才能运行。
六、可视化工具的操作方法
(1)Excel作图法
然而它受到了最大行、列数的限制,如Excel2003的单个工作表最多包含65536行和256列,Excel2007增加到了1048576行和16384列),对于更大规模的数据存储和显示则能力有限。所以大规模的生物数据,如基因组和蛋白质组序列等信息,通常以支持更大容量的文本文件格式表示,并利用UltraEdit等专业工具进行查看。
Excel最简单、容易上手,但是功能性不强,不能像R包那样设置更多其他参
数。
那怎样操作呢?
1、打开MSExcel,制作一个100个随机数的数据集。
使用“=RAND()”,通过拉取的方式得到100个随机数据集。
2、选取“数据集”、“格式”、“条件格式”、“显示其他格式规则”、“新建规则”。最低值调为冷色,最高值调为暖色
3、点击确定,得到一个简单热图
4、我们不需要在图上显示数据。选中“设置单元格格式”、数字分类自定义,在类型中输入英文状态下的三个符号“;;;”
(2)R包的pheatmap绘制热图
首先,先给大家理清一下pheatmap参数的含义。
pheatmap基础绘图操作示范
第一步,加载你所需要用到R包。
library(pheatmap)
第二步,设置工作路径。
setwdrm(list=ls())
第三步,构建测试数据集。
test=matrix(rnorm(200),20,10)test[1:10,seq(1,10,2)]=test[1:10,seq(1,10,2)]+3test[11:20,seq(2,10,2)]=test[11:20,seq(2,10,2)]+2test[15:20,seq(2,10,2)]=test[15:20,seq(2,10,2)]+4colnames(test)=paste("Test",1:10,sep="")rownames(test)=paste("Gene",1:20,sep="")head(test)
结果生成如下:
第四步,绘图
pheatmap(test)
参数对行归一化
pheatmap(test,scale="row")
参数设定不同聚类方法
pheatmap(test,scale="row",clustering_method="average")
参数自定义颜色
pheatmap(test,color=colorRampPalette(c("navy","white","firebrick3"))(50))
参数设定不对行进行聚类
pheatmap(test,cluster_row=FALSE)
legend_breaks参数设定图例显示范围,legend_labels参数添加图例标签。
pheatmap(test,legend_breaks=c(1:5),legend_labels=c("1.0","2.0","3.0","4.0","5.0"))
legend=FALSE参数去掉图例
pheatmap(test,legend=FALSE)
border=FALSE参数去掉边框线
pheatmap(test,border=FALSE)
show_rownames和show_colnames参数设定是否显示行名和列名。
pheatmap(test,show_rownames=F,show_colnames=F)
treeheight_row和treeheight_col参数设定行和列聚类树的高度,默认为50
pheatmap(test,treeheight_row=30,treeheight_col=50)
display_numbers=TRUE参数设定在每个热图格子中显示相应的数值,number_color参数设置数值字体的颜色
pheatmap(test,display_numbers=TRUE,number_color="blue")
自定义数值的显示方式
pheatmap(test,display_numbers=matrix(ifelse(test>5,"*",""),nrow(test)))
cellwidth和cellheight参数设定每个热图格子的宽度和高度,main参数添加主标题。
pheatmap(test,cellwidth=15,cellheight=12,main="Example")
构建列注释信息
annotation_col=data.frame(CellType=factor(rep(c("CT1","CT2"),5)),Time=1:5)rownames(annotation_col)=paste("Test",1:10,sep="")head(annotation_col)
得出的结果如下:
CellTypeTimeTest1CT11Test2CT22Test3CT13Test4CT24Test5CT15Test6CT21
构建行注释信息
annotation_row=data.frame(GeneClass=factor(rep(c("Path1","Path2","Path3"),c(10,4,6))))rownames(annotation_row)=paste("Gene",1:20,sep="")head(annotation_row)
GeneClassGene1Path1Gene2Path1Gene3Path1Gene4Path1Gene5Path1Gene6Path1
annotation_col参数添加列注释信息
pheatmap(test,annotation_col=annotation_col)
annotation_legend=FALSE参数去掉注释图例
pheatmap(test,annotation_col=annotation_col,annotation_legend=FALSE)
同时添加行和列的注释信息
pheatmap(test,annotation_row=annotation_row,annotation_col=annotation_col)
自定义注释信息的颜色列表
ann_colors=list(Time=c("white","firebrick"),CellType=c(CT1="#1B9E77",CT2="#D95F02"),GeneClass=c(Path1="#7570B3",Path2="#E7298A",Path3="#66A61E"))head(ann_colors)
$Time[1]"white""firebrick"$CellTypeCT1CT2"#1B9E77""#D95F02"$GeneClassPath1Path2Path3"#7570B3""#E7298A""#66A61E"
设定注释信息的颜色
pheatmap(test,annotation_col=annotation_col,annotation_colors=ann_colors,main="Title")
pheatmap(test,annotation_col=annotation_col,annotation_row=annotation_row,annotation_colors=ann_colors)
pheatmap(test,annotation_col=annotation_col,annotation_colors=ann_colors[2])
pheatmap(test,annotation_col=annotation_col,cluster_rows=FALSE,gaps_row=c(10,14))
pheatmap(test,annotation_col=annotation_col,cluster_rows=FALSE,gaps_row=c(10,14),cutree_col=2
pheatmap(test,annotation_col=annotation_col,cluster_rows=FALSE,cluster_cols=FALSE,gaps_row=c(6,10,14),gaps_col=c(2,5,8))
labels_row=c("","","","","","","","","","","","","","","","","","Il10","Il15","Il1b")pheatmap(test,annotation_col=annotation_col,labels_row=labels_row)
~一张热图就这样轻松制作完成啦~
第五步,将热图结果按聚类后的顺序输出。
aa=pheatmap(test,scale="row")summary(aa)
得出,
LengthClassModetree_row7hclustlisttree_col7hclustlistkmeans1-none-logicalgtable6gtablelist
order_row=aa$tree_row$orderorder_col=aa$tree_col$orderdatat=data.frame(test[order_row,order_col])datat=data.frame(rownames(datat),datat,check.names=F)colnames(datat)[1]="geneid"write.table(datat,file="reorder.txt",row.names=FALSE,quote=FALSE,sep='\t')sessionInfo()
下面介绍一下常用的代码
对样本或基因标记分类的代码
#构建列注释信息my_sample_col<-data.frame(sample=rep(c("tumour","normal"),c(4,2)),Time=c(1,1,2,2,2,1))row.names(my_sample_col)<-colnames(test)head(my_sample_col)sampleTimeT1atumour1T1btumour1T2tumour2T3tumour2N1normal2N2normal1
#构建行注释信息,这里代码产生分组信息,也可以从数据读入一个表格,list=pheatmap(test)my_gene_col=cutree(list$tree_row,k=2)my_gene_col<-data.frame(cluster=ifelse(test=my_gene_col==1,yes="cluster1",no="cluster2"))set.seed(1984)my_random<-as.factor(sample(x=1:2,size=nrow(my_gene_col),replace=TRUE))my_gene_col$random<-my_randomhead(my_gene_col)clusterrandomGene_00562cluster12Gene_02296cluster22Gene_03861cluster22Gene_07390cluster22Gene_08042cluster21Gene_08694cluster11
行列注释的代码
pheatmap(test,annotation_row=my_gene_col,annotation_col=my_sample_col)
自定义分组颜色的代码
ann_colors=list(Time=c("white","firebrick"),sample=c(normal="#1B9E77",tumour="#D95F02"),cluster=c(`cluster1`="#7570B3",`cluster2`="#E7298A"),random=c(`1`="red",`2`="blue"))head(ann_colors)#annotation_colors设定注释信息的颜色pheatmap(test,annotation_col=my_sample_col,annotation_row=my_gene_col,annotation_colors=ann_colors,main="Title")
热图分块显示的代码
#手动指定gap划分区块:gaps_row=c(6,10)参数在第6和10行处添加gap,要求对行不进行聚类。对应的还有gaps_col,大家也可以试试pheatmap(test,annotation_col=my_sample_col,cluster_rows=FALSE,gaps_row=c(6,10))
#cutree_col=2,cutree_rows=2参数将列按聚类树的结果分成两部分,要求对列和进行聚类pheatmap(test,annotation_row=my_gene_col,annotation_col=my_sample_col,cutree_rows=2,cutree_cols=2)#自定义行的标签名。注意:基因名称的顺序与原始表格的顺序一致,而不是聚类后的顺序:labels_row=c("","","","","","","","","","","","","","","","","","TP53","FLC","her2","","","","","","AKT")#labels_row参数添加行标签pheatmap(test,annotation_col=my_sample_col,labels_row=labels_row)
(3)R包的ComplexHeatmap绘制热图
Complexheatmap是由顾祖光博士创建的R包,在他的GitHub里有详细的故事。ComplexHeatmap是基于绘图系统grid的。
Complexheatmap的设计原理是,它提供一套很灵活的方法,用于多热图,即热图列表布局及支持自定义注释绘图,一个热图列表包含若干热图和注释信息。
绘制热图首先需要准备已经标准化的二维矩阵作为输入,可以出图后我们就需要对主体部分进行修改,一些比较常用的参数包括单元格(颜色,边界,大小等),行/列聚类(是否聚类,是否展示聚类树,聚类树的位置,大小,颜色等),行/列注释(行/列名,位置,大小,颜色,角度等),图注信息等。
在ComplexHeatmap主要使用了grid绘图系统,使用gpar调整热图参数:
"col"控制颜色
"fill"控制填充色
"alpha"控制透明度
"lty"线的类型
"lwd"线宽
“fontsize"字符大小
而unit参数则主要控制一些距离参数,包括子图间的空隙row/column_gap=unit(1,"mm"),热图的长宽heatmap_width/height=unit(1,"npc"),聚类树的高度row/column_dend_width/height=unit(10,"mm")以及文字的最大长度row/column_names_max_width/height=unit(6,"cm")等。
控制聚类信息的参数:
cluster_columns,cluster_rows指定是否聚类
show_row_dend,show_column_dend是否展示聚类结果(进行聚类)
row_names_side,column_name_size
clustering_method_rows,clustering_method_columns聚类方法
row_dend_width,column_dend_height聚类树宽/高
row_km,column_km按聚类结果拆分热图
控制单元格的参数:
col=circlize::colorRamp2(c(-2,0,2),c("navy","white","firebrick3"))颜色。
rect_gp=gpar(col="white")指定单元格边界颜色
border指定热图边界颜色
控制行/列标签的参数:
row_labels,column_labels行/列标签
show_column_names,show_row_names是否显示列/行名
row_names_side``coolumn_names_side显示行/列名的位置("left","right","top","bottom")
row_names_gp``column_names_gp控制行/列名大小(gpar(fontsize=12))
row_names_rot``column_names_rot控制行/列名的角度
控制整体图形的参数:
heatmap_width=unit(1,"npc"),heatmap_height=unit(1,"npc")图形高/宽度
row_gap=unit(1,"mm"),column_gap=unit(1,"mm")子图空隙
控制图注的参数:
show_heatmap_legend是否展示图注
heatmap_legend_param图注参数(list(at=c(-2,0,2),labels=c(-2,0,2))#需要制定at和labels的list)
控制注释的参数:
"top_annotation=NULL"
"bottom_annotation=NULL"
"left_annotation=NULL"
"right_annotation=NULL"
HeatmapAnnotation热图注释
对于ComplexHeatmap来说,其主旨就是绘制复杂热图,所以对热图的注释以及拼图极其重视,对于*_annotation来说包括包括各种类型图形和文字丰富结果,并且还支持使用+(行)和%v%(列)对多个热图进行组装。热图注释是热图的重要组成部分,它显示与热图中的行或列关联的其他信息。ComplexHeatmap软件包为设置注释和定义新的注释图形提供了非常灵活的支持。注释可以放在热图的四个侧面,由top_annotation,bottom_annotation,left_annotation和right_annotation参数。
第一步,载入R包,完成本地安装。
if(!requireNamespace("BiocManager",quietly=TRUE))install.packages("BiocManager")BiocManager::install("ComplexHeatmap")
第二步,安装完成后,输入加载命令。
library(ComplexHeatmap)library(circlize)
ComplexHeatmap包提供了一种更灵活的方式支持单个热图的可视化。在下面的简单例子中,我们会说明如何设置参数以显示一个简单热图。
首先,载入语言包并生成一个随机矩阵。
set.seed(123)mat=cbind(rbind(matrix(rnorm(16,-1),4),matrix(rnorm(32,1),8)),rbind(matrix(rnorm(24,1),4),matrix(rnorm(48,-1),8)))mat=mat[sample(nrow(mat),nrow(mat)),sample(ncol(mat),ncol(mat))]rownames(mat)=paste0("R",1:12)colnames(mat)=paste0("C",1:10)
使用默认参数,一行命令即可作图
Heatmap(mat)
大多数情况下,热图可视化含连续值得矩阵。在这种情况下,用户需提供一个颜色映射函数。一个颜色映射函数需要接收一个数值向量并返回对应得颜色。circlize包提供得colorRamp2()对于生成这样得函数很有用。当前该函数通过LAB颜色空间线性在每个区间插入颜色。
-3到3的区间被线性插入值用于获取对应的颜色,值大于3的被映射为红色,小于-3的被映射为绿色,因此这里的颜色对于异常值具有鲁棒性。
mat2=matmat2[1,1]=100000Heatmap(mat2,col=colorRamp2(c(-3,0,3),c("green","white","red")),cluster_rows=FALSE,cluster_columns=FALSE)
如果矩阵值是连续的,也可提供一个颜色向量,颜色会根据第k个百分位进行插值。不过要记住这种方法对于异常点没有鲁棒性。
Heatmap(mat,col=rev(rainbow(10)))
如果矩阵包含离散值(要么是数值的要么是字符串),颜色应该指定为一个命名向量用于将离散值映射为颜色。如果颜色没有名字,那么颜色的顺序会对应于unique(mat)的顺序。
discrete_mat=matrix(sample(1:4,100,replace=TRUE),10,10)colors=structure(circlize::rand_color(4),names=c("1","2","3","4"))Heatmap(discrete_mat,col=colors)
或者一个字符串矩阵:
discrete_mat=matrix(sample(letters[1:4],100,replace=TRUE),10,10)colors=structure(circlize::rand_color(4),names=letters[1:4])Heatmap(discrete_mat,col=colors)
你可以看到,对于数值型矩阵(无论它是连续映射还是离散映射),默认两个维度都会进行聚类。而对于字符串矩阵,聚类默认是被抑制的。
热图中允许存在NA值。你可以通过na_col参数控制NA值的颜色。包含NA值矩阵也可以使用Heatmap()函数聚类(因为dist()函数接收NA值),使用“pearson”、“spearman”或“kendall”方法会给出警告信息。
mat_with_na=matmat_with_na[sample(c(TRUE,FALSE),nrow(mat)*ncol(mat),replace=TRUE,prob=c(1,9))]=NAHeatmap(mat_with_na,na_col="orange",clustering_distance_rows="pearson")##Warninginget_dist(submat,distance):NAexistsinthematrix,calculatingdistancebyremovingNA##values.
对颜色插值来说颜色空间非常重要。默认情况下,颜色都是在LABcolorspace中线性插值,但你可以使用,colorRamp2()函数选择其他的颜色空间。比较下面的两幅图:
f1=colorRamp2(seq(min(mat),max(mat),length=3),c("blue","#EEEEEE","red"))f2=colorRamp2(seq(min(mat),max(mat),length=3),c("blue","#EEEEEE","red"),space="RGB")Heatmap(mat,col=f1,column_title="LABcolorspace")+Heatmap(mat,col=f2,column_title="RGBcolorspace")
设置标题
Heatmap(mat,name="legend")
热图图例的标题也可以通过参数heatmap_legend_param进行更改。
Heatmap(mat,heatmap_legend_param=list(title="legend"))
你可以设定热图的行与列标题,行与列图形参数分别通过row_title_gp和column_title_gp选项指定,使用gpar()函数进行具体的设置。
Heatmap(mat,name="foo",column_title="X",row_title="Y")
Heatmap(mat,name="foo",column_title="HAHAHA",column_title_gp=gpar(fontsize=20,fontface="bold"))
标题的选择可以使用row_title_rot和column_title_rot设置,但只支持水平和垂直旋转。
Heatmap(mat,name="foo",row_title="Le",row_title_rot=0)
聚类
聚类是热图可视化的关键特征之一。该包支持高度灵活的聚类设定。
首先有一些聚类的通用设定,例如是否显示树状图、大小。
Heatmap(mat,name="foo",cluster_rows=FALSE,show_column_dend=FALSE)
Heatmap(mat,name="foo",column_dend_height=unit(2,"cm"))
有3种方式指定聚类的距离度量:
使用提前设定的选项,合法的值包括dist()函数支持的方法以及pearson、spearman和kendall。
一个从矩阵中计算距离的自定义函数,函数仅包含一个参数。
一个从两个向量中计算距离的自定义函数,函数仅包含2个参数。
Heatmap(mat,name="foo",clustering_distance_rows="pearson")Heatmap(mat,name="foo",clustering_distance_rows=function(m)dist(m))Heatmap(mat,name="foo",clustering_distance_rows=function(x,y)1-cor(x,y))Heatmap(mat,name="foo",clustering_distance_rows=function(x,y)1-cor(x,y))
基于这个特征,我们开源使用配对距离应用聚类使得可以鲁棒地处理异常值。
mat_with_outliers=matfor(iin1:10)mat_with_outliers[i,i]=1000robust_dist=function(x,y){qx=quantile(x,c(0.1,0.9))qy=quantile(y,c(0.1,0.9))l=x>qx[1]&x 如果提供了距离方法,你也可以对字符串矩阵进行聚类。cell_fun参数会在后面进行解释。 mat_letters=matrix(sample(letters[1:4],100,replace=TRUE),10)#distanceinthASCIItabledist_letters=function(x,y){x=strtoi(charToRaw(paste(x,collapse="")),base=16)y=strtoi(charToRaw(paste(y,collapse="")),base=16)sqrt(sum((x-y)^2))}Heatmap(mat_letters,name="foo",col=structure(2:5,names=letters[1:4]),clustering_distance_rows=dist_letters,clustering_distance_columns=dist_letters,cell_fun=function(j,i,x,y,w,h,col){grid.text(mat_letters[i,j],x,y)}) 创建层次聚类的方法可以通过选项clustering_method_rows和clustering_method_columns指定,可以使用hclust()函数支持的方法。 Heatmap(mat,name="foo",clustering_method_rows="single") 默认,聚类由hclust()实施。但你可以通过cluster_rows或cluster_columns指定由其他方法生成的hclust或dendrogram对象。在下面的例子中,我们使用来自cluster包的diana()和agnes()函数进行聚类。 library(cluster)Heatmap(mat,name="foo",cluster_rows=as.dendrogram(diana(mat)),cluster_columns=as.dendrogram(agnes(t(mat)))) 自定义热图主体 rect_gp参数提供了热图主体的基本图形设置。 Heatmap(mat,name="foo",rect_gp=gpar(col="green",lty=2,lwd=2)) 热图主体可以自定义。默认热图主体由带不同填充色的矩形数组组成(这里称为cell)。如果rect_gp中的type设置为none,整个cell数组被初始化但没有图形,然后用户可以通过cell_fun自定义他们自己的图形函数。cell_fun应用于热图的每一个cell,它需要为每一个cell提供下面的信息: j-矩阵中的列索引 i-矩阵中的行索引 x-cell中心点的x坐标 y-cell中心点的y坐标 width-cell的宽度 height-cell的高度 fill-cell的填充色 给热图添加数值信息 Heatmap(mat,name="foo",cell_fun=function(j,i,x,y,width,height,fill){grid.text(sprintf("%.1f",mat[i,j]),x,y,gp=gpar(fontsize=10))}) (4)用ggplot2包(geom_tile函数)绘制热图 ggplot的绘图有以下几个特点:第一,有明确的起始(以ggplot函数开始)与终止(一句语句一幅图);其二,图层之间的叠加是靠“+”号实现的,越后面其图层越高。 ggplot2图的元素主要概括为:plot(整张图,包括background和title);axis(包括stick、text、title);legend(包括background、text、title);facet分为外部strip部分(background和text)和内部panel部分(background、border、网格线grid.major和grid.minor)。 几何对象函数 函数定义geom_abline线图,由斜率和截距指定geom_area 面积图(即连续的条形图) geom_bar条形图geom_bin2d 二维封箱的热图 geom_blank空的几何对象geom_boxplot 箱线图 geom_contour轮廓图geom_crossbar 没有触须和极值点的图 geom_density 密度图 geom_density2d 二维密度图 geom_errorbar误差线(通常添加在柱状图等)geom_errorbarh 水平误差线 geom_freqpoly 频率多边形 geom_hex 六边形图 geom_histogram直方图geom_hline水平线geom_jitter点geom_line线geom_linerange区间,用竖直线表示geom_path 几何路径,由一组点按顺序连接 geom_point点geom_pointrange一条垂直线,线的中间有一个点geom_polygon多边形geom_quantile 一组分位数线 geom_rect二维的长方形geom_ribbon彩虹图(在连续的x值上表示y的范围)geom_rug触须geom_segment 线段 geom_smooth平滑的条件均值geom_step阶梯图geom_text文本geom_tile小长方形或多边形geom_vline竖直线 统计变换函数 函数定义stat_abline添加线条,用斜率和截距表示stat_bin 分割数据,然后绘制直方图 stat_bin2d二维密度图,用矩阵表示stat_binhex 二维密度图,用六边形表示 stat_boxplot绘制带触须的箱线图stat_contour绘制三维数据的等高线图stat_density绘制密度图stat_density2d绘制二维密度图stat_function添加函数曲线stat_identity绘制原始数据,不进行统计变换stat_qq绘制Q-Q图stat_quantile 连续的分位线 stat_smooth添加平滑曲线stat_spoke绘制有方向的数据点(由x和y指定位置,angle指定角度)stat_sum绘制不重复的取值之和stat_summary绘制汇总数据stat_unique 绘制不同的数值,去掉重复的数值 stat_vline绘制竖直线 标度函数 函数定义scale_alpha alpha通道值(灰度) scale_brewer 颜色标度 scale_continuous 连续标度 scale_datetime scale_data 数据 scale_discrete离散值scale_gradient 两种颜色构建的渐变色 scale_gradient23种颜色构建的渐变色scale_gradientn n种颜色构建的渐变色 scale_grey 灰度颜色 scale_hue 均匀色调 scale_identity 直接使用指定的取值,不进行标度转换 scale_linetype用线条模式来展示不同标度scale_manual 手动指定离散标度 scale_shape 用不同的形状来展示不同的数值 scale_size 用不同大小的对象来展示不同的数值 作图的表达公式 散点图 library('ggplot2')ggplot(mpg,mapping=aes(x=displ,y=hwy))+geom_point(colour='red') 直方图 library('ggplot2')ggplot(faithful,aes(x=waiting))+geom_histogram(binwidth=5,fill='lightblue',colour="black") 分组直方图 library('MASS')head(birthwt)birthwt$smoke=factor(birthwt$smoke)ggplot(birthwt,aes(x=bwt,fill=smoke))+geom_histogram(position="identity",alpha=0.4) 密度函数 birthwt$smoke=factor(birthwt$smoke)ggplot(birthwt,aes(x=bwt,fill=smoke))+geom_density(alpha=0.3) library('MASS')ggplot(birthwt,aes(x=factor(race),y=bwt,fill=factor(race)))+geom_boxplot()+scale_fill_brewer(palette="Pastel2") 小提琴图 library('lattice')ggplot(singer,aes(x=voice.part,y=height))+geom_violin(fill="lightblue")+geom_boxplot(fill="red",width=.1) 组合图形 library(ggplot2)p<-ggplot(data=iris,aes(x=Sepal.Length,y=Sepal.Width))p+geom_point(aes(colour=Species))+stat_smooth()+labs(title="AccordingtotheSepal.Width")+theme_classic()+theme_bw()+annotate("text",x=7,y=4,parse=T,label="x[1]==x[2]",size=6,family="serif",fontface="italic",colour="red") ggplot2的应用语法 geom 表示几何对象,它是ggplot中重要的图层控制对象。 geom_上面指定的图形属性需要呈现在一定的几何对象上才能被我们看到,承载图形属性的对象可以是点、线或bar。stat统计变换,如均值、方差。annotate 添加注释#。因为设置的文本会覆盖原来的图中对应的位置,可改变文本的透明度或颜色,例如annotate(geom=”text”,x=23,y=200,parse=T,label=”x[1]==x[2]”) labs修改名字labs(x=“ThisisXaxis”,y=“ThisisYaxis”,title=“ThisisTitle”)scale_标度是一种函数,它控制了数学空间到图形元素空间的映射。一组连续数据可以映射到X轴坐标,也可映射到一组连续的渐变色彩。coord_ 调整坐标,控制了图形的坐标轴并影响所有图形元素.调整坐标coord_flip()来翻转坐标轴。使用xlim()和ylim()来设置连续型坐标轴的最小值和最大值coord_cartesian(xlim=c(0,100),ylim=c(0,100)) guides调整所有的text。theme 调整不与数据有关的图的元素的函数。theme函数采用了四个简单地函数来调整所有的主题特征:element_text调整字体,element_line调整主题内的所有线,element_rect调整所有的块,element_blank清空。theme(panel.grid=element_blank())##删去网格线 ggplot2包需要一种较长的数据格式,我们可以用重塑的安装包创建这个数据格式。 install.packages("reshape")library("reshape") 或者,用融解函数新建一个格式。 data_melt<-melt(data)head(data_melt) 我们用ggplot2包绘画热图之前,需要加载ggplot2: install.packages("ggplot2")library("ggplot2") 我们可以用geom_tile函数绘画默认的基础热图 ggp<-ggplot(data_melt,aes(X1,X2))+geom_tile(aes(fill=value))ggp 当然,ggplot2同样也能modify热图。可以用scale_fill_gradient参数,颜色可以自定义。 ggp+scale_fill_gradient(low="pink",high="black") (5)用plotly包(plot_ly函数)绘制热图 Plotly是一个基于JavaScript技术的一项开源项目。JavaScript开发了多种平台的API接口,包括Python、MATLAB、Excel,提供的图像类型很丰富。 首先我们在RStudio上加载plotly包,方可运行。 install.packages("plotly")library("plotly") plotly包含有plot_ly函数,可用来绘画指定类型的热图。 plot_ly(z=data,type="heatmap") 这个plotly包同样也提供了不少函数去修饰热图。比如可以手动调整颜色范围或用些预先定义好的函数colorscale=“Greys”。 plot_ly(z=data,colorscale="Greys",type="heatmap") 这里要特别注意的是,plotly包会把图显示在RStudio的“viewer”窗口,而不是在“plot”窗口。 plotly包的基本函数 在plotly包中,主要的绘图函数有三个: plot_ly():用来绘制基础图形。 add_trace():用来在已有图形上添加新图形。add_xxx()函数有多种类型可供调用,如add_lines(),add_area()。 layout():用来设置图形外观,比如标题属性、横纵坐标轴属性、图例属性、图形外边距属性。 plotly包利用plot_ly函数绘制交互图。 如果想绘制交互箱线图,需要将type参数设置为box。 library(plotly)plot_ly(midwest,x=percollege,color=state,type="box") 如果你已熟悉ggplot2的绘图系统,也可以针对ggplot2绘制的对象p,利用ggplotly函数实现交互效果。例如我们想对ggplot绘制的密度图实现交互效果,执行以下代码即可: library(plotly)p<-ggplot(data=lattice::singer,aes(x=height,fill=voice.part))+geom_density()+facet_grid(voice.part~.)(gg<-ggplotly(p)) (6)用DT包绘制热图 DT包实现R数据对象可以在HTML页面中实现过滤、分页、排序以及其他许多功能。先安装并运行DT包。 install.packages("DT") 以鸢尾花数据集iris为例,执行以下代码: library(DT)datatable(iris) (7)在GraphPadPrism软件绘制热图 在弹出的向导页面选择表格类型,表格类型选Grouped,选Enterorimportdataintoanewtable(如下图)。 接下来将数据粘贴到Prism的表格中,双击表格的名字(默认Data1)改为top30,如下图。 在左侧导航栏中Graphs菜单下点NewGraph...新建图表,show选择Grouped,选择HeatMap,如下图。 通过ExportGraph窗口导出所需格式的图片,如下图。这里就示范导出成pdf格式,以便日后可反复调整。 (8)在MATLAB软件绘制热图 MATLAB(MATrixLABoratory)是一款由美国MathWorks公司出品的商业数学软件。MATLAB是一个用于算法开发、数据可视化、数据分析及数值计算的高级技术计算语言和交互式环境。除了矩阵运算、绘制函数/数据图像等常用功能,MATLAB还可用来创建用户界面或调用其他语言(如C、C++和FORTRAN)编写的程序。MATLAB以其高效、易学易用、接口方便灵活等特性受到了广大科技人员的欢迎。 尽管MATLAB主要用于数值运算,但利用附加工具箱,它也适用于不同领域的应用。如MATLAB的生物信息学工具箱提供了序列比对与进化树构建、基因芯片数据分析、质谱数据分析和细胞过程模拟等多种功能,并且包括了丰富的应用实例,是生物信息学研究的重要分析工具。 下面我们将开始非常详细的Matlabheatmap函数语法介绍,实例引用,结果展示。首先,我们给出Matlab中关于heatmap函数的帮助文本如下: 常见用法 heatmap(tbl,xvar,yvar)heatmap(tbl,xvar,yvar,'ColorVariable',cvar)heatmap(cdata)heatmap(xvalues,yvalues,cdata)heatmap(___,Name,Value)heatmap(parent,___)h=heatmap(___) 语法说明 heatmap(tbl,xvar,yvar)基于表tbl创建一个热图。xvar输入参数指示沿x轴显示的表变量。yvar输入参数指示沿y轴显示的表变量。默认颜色基于计数聚合,这种方法计算每对x和y值一起出现在表中的总次数。heatmap(tbl,xvar,yvar,’ColorVariable’,cvar)使用cvar指定的表变量来计算颜色数据。默认的计算方法为均值聚合。heatmap(cdata)基于矩阵cdata创建一个热图。热图上的每个单元格对应cdata中的一个值。heatmap(xvalues,yvalues,cdata)指定沿x轴和y轴显示的值的标签。heatmap(___,Name,Value)使用一个或多个名称-值对组参数指定热图的其他选项。请在所有其他输入参数之后指定这些选项。heatmap(parent,___)在由parent指定的图窗、面板或选项卡上创建热图。h=heatmap(___)返回HeatmapChart对象。创建图后,使用h修改图属性。 下面给大家做一示范。基于内科病人数据表创建一个热图。 先加载patients数据集,并基于加载到工作区中的变量子集创建一个表。然后创建一个热图,计算具有一组相同Smoker和SelfAssessedHealthStatus值的患者总数。 loadpatientstbl=table(LastName,Age,Gender,SelfAssessedHealthStatus,...Smoker,Weight,Location);h=heatmap(tbl,'Smoker','SelfAssessedHealthStatus'); 重新排列热图标签 创建一个热图,并重新排列y轴上的标签。 加载patients数据集,并基于这些数据创建一个热图。将HeatmapChart对象赋给变量h。 重新排列y轴上的标签。 h.YDisplayData={'Excellent','Good','Fair','Poor'}; 您也可以通过将数据更改为分类数据,然后使用reordercats函数重新排列类别来重新排列标签。同样,您可以分别使用addcats、removecats或renamecats函数添加、删除或重命名热图标签。 为热图颜色指定表变量 创建一个热图,并指定用来确定热图单元格颜色的表变量。 加载patients数据集,并基于这些数据创建一个热图。通过将ColorVariable选项设置为‘Age’,使用具有一组特定Smoker和SelfAssessedHealthStatus值的患者平均年龄为每个单元格着色。 loadpatientstbl=table(LastName,Age,Gender,SelfAssessedHealthStatus,...Smoker,Weight,Location);h=heatmap(tbl,'Smoker','SelfAssessedHealthStatus','ColorVariable','Age'); 使用自定义轴标签基于矩阵数据创建热图 创建一个数据矩阵。然后创建矩阵值的热图。通过将前两个输入参数指定为所需的标签,在x轴和y轴上使用自定义标签。通过设置HeatmapChart对象的属性,指定标题和轴标签。 cdata=[456032;435476;329468;239558];xvalues={'Small','Medium','Large'};yvalues={'Green','Red','Blue','Gray'};h=heatmap(xvalues,yvalues,cdata);h.Title='T-ShirtOrders';h.XLabel='Sizes';h.YLabel='Colors'; 归一化每行或每列的颜色 创建一个热图,并通过设置ColorScaling属性来归一化每列或每行的颜色。 将示例文件outages.csv读入到表中。示例文件中包含表示美国电力中断事故的数据。该表包含六列:Region、OutageTime、Loss、Customers、RestorationTime...