诚然,小编的上一篇(如何让你的图变得高大上之ComplexHeatmap())结局得太匆匆,因此,本篇奉上作图代码实例。
本次,我们将展示一个甲基化与表达谱联合分析的热图。本着先学习再创造的态度,小编做了一下知识的搬运工,本篇所有代码均引用自:Zuguang Gu, Roland Eils and Matthias Schlesner,?Complex heatmaps reveal patterns and correlations in multidimensional genomic data,?Bioinformatics, 2016。
我们先上效果图:
其实代码并不长,关键在于如何准备作图所用数据以及对代码的理解上,所以下面将着重对这两点进行解释说明。
>library(ComplexHeatmap)
>library(circlize)
#为了测试方便,用setwd设置工作路径
setwd(“/media/bmk/***/Meth_Exp”)
#rds格式是一种保存了数据的数据类型和结构的格式,可以用函数saveRDS()来生成这种格式的文件。meth.rds文件来自R包示例文件,如需查看这个文件中都是什么,请参考(看不清热图的聚类结果怎么办)的方法。另外,文件中只包含了DMR关联基因的甲基化和表达量呈现负相关的DMR
>res_list?=?readRDS(“data/meth.rds”)
#显示样本是肿瘤样本还是正常样本的标签
>type?=?res_list$type
(20个正常样本和20个肿瘤样本)
#矩阵,其中行对应差异甲基化区域(DMR),矩阵中的值是每个样品中DMR中的平均甲基化水平。
>mat_meth?=?res_list$mat_meth
#矩阵,其中行对应于与DMR相关的基因(即与DMR最近的基因,也可以叫做DMR关联基因),矩阵中的值是每个样品中每个基因的表达水平(对样品中的每个基因的表达进行了标准化)。
>mat_expr?=?res_list$mat_expr
#甲基化变化的方向(hyper表示肿瘤样本中高甲基化,hypo表示肿瘤样本中低甲基化)
>direction?=?res_list$direction
#甲基化与甲基化关联基因相关性p值
>cor_pvalue?=?res_list$cor_pvalue
#基因类型(如蛋白编码基因或lincRNA等)
>gene_type?=?res_list$gene_type
#DMR注释到基因的功能区间(如intergenic/intragenic或者TSS
>anno_gene?=?res_list$anno_gene
#DMR到关联基因TSS的距离
>dist?=?res_list$dist
#与增强子重叠的DMR的部分
>anno_enhancer?=?res_list$anno_enhancer
#颜色定义参见上一篇(如何让你的图变得高大上之ComplexHeatmap()) ##我们首先定义两个列注释,然后制作复杂的热图。 >ht_global_opt( #Heatmap()实际上是单一热图的类构造函数。如果需要组合超过一个热图,用户可以通过+操作符添加热图。默认情况下,将两个热图通过+连接后,第二个热图的行聚类树会去掉,行的顺序会与是第一个热图的顺序保持一致。
##首先计算甲基化矩阵的列聚类,以便可以将表达矩阵中的列调整为具有与甲基化矩阵中相同的列顺序。
>column_tree?=?hclust(dist(t(mat_meth)))
>column_order?=?column_tree$order
>library(RColorBrewer)
#定义甲基化表达水平颜色,从0/blue-0.5/white-1/red渐变
>meth_col_fun?=?colorRamp2(c(0,?0.5,?1),?c(“blue”,?“white”,?“red”))
#定义甲基化变化方向对应颜色
>direction_col?=?c(“hyper”?=?“red”,?“hypo”?=?“blue”)
#定义表达水平颜色
>expr_col_fun?=?colorRamp2(c(-2,?0,?2),?c(“green”,?“white”,?“red”))
#定义相关性p值颜色
>pvalue_col_fun?=?colorRamp2(c(0,?2,?4),?c(“white”,?“white”,?“red”))
#定义基因类型颜色
>gene_type_col?=?structure(brewer.pal(length(unique(gene_type)),?“Set3”),
names?=?unique(gene_type))
#定义注释model颜色
>anno_gene_col?=?structure(brewer.pal(length(unique(anno_gene)),?“Set1”),
names?=?unique(anno_gene))
#定义距离颜色
>dist_col_fun?=?colorRamp2(c(0,?10000),?c(“black”,?“white”))
#定义增强子相关颜色
>enhancer_col_fun?=?colorRamp2(c(0,?1),?c(“white”,?“orange”))
#ht_global_opt()是一个可选函数,它会全局控制一些参数。我们可以通过此全局函数同时为所有热图/注释设置一些参数。需要注意的是,一定将它放在热图代码(也就是Heatmap())之前,并在绘制热图后重置所有选项值以消除对下一个热图的影响。
#可以通过?ComplexHeatmap::ht_global_opt查看此函数的帮助
>?names(ht_global_opt())????????#可查看该函数可定义的参数
[1]?“heatmap_row_names_gp”
[2]?“heatmap_column_names_gp”
[3]?“heatmap_row_title_gp”
[4]?“heatmap_column_title_gp”
[5]?“heatmap_legend_title_gp”
[6]?“heatmap_legend_title_position”
[7]?“heatmap_legend_labels_gp”
[8]?“heatmap_legend_grid_height”
[9]?“heatmap_legend_grid_width”
[10]?“heatmap_legend_grid_border”
[11]?“annotation_legend_title_gp”
[12]?“annotation_legend_title_position”
[13]?“annotation_legend_labels_gp”
[14]?“annotation_legend_grid_height”
[15]?“annotation_legend_grid_width”????[16]?“annotation_legend_grid_border”
[17]?“fast_hclust”
heatmap_legend_title_gp?=?gpar(fontsize?=?8,?fontface?=?“bold”),
heatmap_legend_labels_gp?=?gpar(fontsize?=?8),
heatmap_column_names_gp?=?gpar(fontsize?=?8),
heatmap_column_title_gp?=?gpar(fontsize?=?10),
heatmap_row_title_gp?=?gpar(fontsize?=?8)
)
#利用HeatmapAnnotation()对行或列注释。HeatmapAnnotation()函数会生成一个注释用的list对象。该函数的主要格式是HeatmapAnnotation(df/数据框, name/注释名称, col/注释颜色列表, show_legend/是否显示数据框中每一列的图例)
#样本类型注释,Tumor样本为pink,Control样本为royalbule,名称在左边
>ha?=?HeatmapAnnotation(type?=?type,
col?=?list(type?=?c(“Tumor”?=?“pink”,?“Control”?=?“royalblue”)),
annotation_name_side?=?“left”)
#不显示图例名称
>ha2?=?HeatmapAnnotation(type?=?type,
col?=?list(type?=?c(“Tumor”?=?“pink”,?“Control”?=?“royalblue”)),
show_legend?=?FALSE)
>ht_list?=?Heatmap(mat_meth,?name?=?“methylation”,?col?=?meth_col_fun,
column_order=?column_order,
top_annotation?=?ha,?column_title?=?“Methylation”)?+
复杂的热图显示高度甲基化的DMR富含基因间和基因内区域,很少与增强子重叠。相反,低甲基化的DMR富含转录起始位点(TSS)和增强子。
知识点总结
1.ComplexHeatmap可实现单个热图的相加以实现数据之间的联合。
2.ht_global_opt()函数可实现整个热图的全局控制,但要注意使用结束后进行重置。
3.draw()函数在返回值是HeatmapList对象可以实现更多的控制。
]]>
pheatmap的安装非常简单,只需要在R软件中执行一行安装代码即可
install.packages('pheatmap')
安装完成后,我们来看如何使用pheatmap来绘制聚类热图
# 加载软件包
library('pheatmap')
# 生成绘图用的数据
test = matrix(rnorm(200), 20, 10)
test[1:10, seq(1, 10, 2)] = test[1:10, seq(1, 10, 2)] + 3
test[11:20, seq(2, 10, 2)] = test[11:20, seq(2, 10, 2)] + 2
test[15:20, seq(2, 10, 2)] = test[15:20, seq(2, 10, 2)] + 4
colnames(test) = paste("Test", 1:10, sep = "")
rownames(test) = paste("Gene", 1:20, sep = "")
这段代码实际上是利用随机数生成了一个20 X 10的矩阵。
为了模拟不同样品和基因之间的差异,我们将第一行到第10行中奇数列的数值全部加3,将第11行到第20行的偶数列数值全部加2,将15行到20行的偶数列全部加4。最后将列名命名为Test1 ~ Test10,将行名命名为Gene1~Gene 20,最终生成的数据格式如下图
默认参数绘制图形只需要执行以下代码。
pheatmap(test)
生成的图片如下图:
当默认参数不能满足我们的需求时,我们可以根据自己的需要在此基础上修改这个图形。常见的一些参数设置如下:
pheatmap(test,?scale?=?"row")
# scale = “row”的含义是绘图时按行进行均一化。进行均一化可以降低个别特殊样品与其它样品间的差异,这会使得其它样品间的差异在图形中更加显著。一般我们在基于表达量进行聚类分析时,均是常用的参数。绘图结果如下图所示:
如果需要对配色方案进行修改,可以修改color参数,
# colorRampPalette函数可以设置3种颜色(只能是3种),它可以根据给定的向量生成渐变色,这三个参数分别指定了最大值,中间值和最小值的颜色。绘图结果如下:pheatmap(test,?color?=?colorRampPalette(c("navy",?"white",?"firebrick3"))(50))
同时,通过设置cluster_col和cluster_row参数可以控制是否取消对行或列进行聚类分析,具体代码及结果如下:
pheatmap(test,?cluster_col?=?FALSE)
show_rownames和show_colnames参数来控制是否显示行名和列名,如下:
pheatmap(test,show_rownames=F,show_colnames=F)
display_numbers 和number_color 参数可以控制是否在图中显示数字及设置数字的颜色。
pheatmap(test,?display_numbers?=?TRUE,number_color?=?"blue")
cellwidth和cellheight两个参数可以控制每个单元的长度和宽度。参数main可以在图片中添加标题。
pheatmap(test,?cellwidth?=?15,?cellheight?=?12,?main?=?"Example?heatmap")
以上呢,就是在使用pheatmap绘制聚类热图时常用的一些参数。可以看到,使用pheatmap绘制聚类热图是非常简单快速的。通过组合不同的参数,我们可以控制最终生成的图片的样式与效果。更多的功能和参数可以通过执行pheatmap命令查看pheatmap自带的帮助文档来猎取!本期聚类热图的绘制我们就分享完啦,敬请关注其他图形绘制。
截止目前,百迈客成功举办了三场零基础R语言绘图培训班.而由于我们培训班主要是小班教学(20人左右),以及老师行程问题,还有部分老师未赶上前三期培训,因此,现特征集R语言培训班东北、福建、西安、甘肃、北京场意向学员。如果您想学编程,想自己可以随时绘制出编辑部要求的图片,欢迎点击下方按钮联系我们,我们会根据大家填写的意向情况,安排后期的生信培训班场次,说不定下一场就在你的城市哦。
关注我们,随时随地学习