[R语言] Heatmap绘图经验总结

Python011

[R语言] Heatmap绘图经验总结,第1张

这里随机生成了25个0,1之间的均匀分布的随机数,其中,行是样本,列是特征,如图:

第一种方案绘制的Heatmap需要借助于Corrplot包,我们求出dat特征的相关系数矩阵,进一步利用corrplot函数来画图,在该包的官方文档中,对于corrplot函数的参数描述可以说是非常多,这里我给出几种常用的参数:

method 表示热力图中每一块所展示的形状,可选值有: "circle", "square", "ellipse", "number", "shade", "color", "pie";

type 表示相关系数矩阵展示的方式,比如只展示上三角或下三角或者全部展示,可选值有:“full”,“upper","lower”;

tl.pos 指定文本标签(变量名称)的位置,当type=full时,默认标签位置在左边和顶部(lt),当type=lower时,默认标签在左边和对角线(ld),当type=upper时,默认标签在顶部和对角线,d表示对角线,n表示不添加文本标签;

diag 表示对角线上取值,默认为FALSE

cl.pos 表示图例位置,当type=upper或full时,图例在右方,当type=lower时,图例在底部,不需要图例时,需指定该参数为n;

...

下面给出方法运用:

当然,利用corrplot函数画图可以实现图层的叠加,上面这张图就是分上下两部分完成的,其中默认的颜色样式个人觉得还是可以的,只不过对于相关系数值会根据高低颜色深浅会发生变化,对于一些相关性低的值颜色会非常浅,所以看得不是很明显。

关于这个包具体的的使用方法可以参考这位博主写的文章:

这里我们还是用方案一随机生成的矩阵,介绍用pheatmap包来绘制热力图。pheatmap包里关于绘制热力图的参数相对来说比较少,可以帮助我们快速的绘图,这里给出一些常用参数:

color 设置渐变的颜色,通常借助于colorRampPalette函数,比如说设置红黄蓝渐变,并在这之间分成50个等级,我们可以设置color=colorRampPalette(c("red","yellow","blue"))(50)

cluster_cols &cluster_rows 表示是否按行或列聚类,默认值为FALSE

clustering_method 表示聚类方法,默认是complete,此外还"ward.D",“single”,“average”,等;

display_numbers 表示是否在heatmap里面显示数值,默认是FALSE;

show_rownames &show_colnames 表示是否显示行名或列名;

file 设置图片保存位置

...

下面给出方法运用

去掉边框线可能会好看一点:

由于是随机生成的数据,就不显示聚类的效果(只需要把cluster_row和cluster_col删掉即可),总体来说用pheatmap绘制热图会相对简单一点,但是毫不逊色于其他包绘制的热图。此外,如果想对于行或列来显示一些注释信息(annotation),比如将特征分成2类,每一类是不同的颜色,这里就可以先生成一个行名是特征,列名是分类结果的数据框,然后利用annotation_row(或col)参数,将生成的数据框赋给它即可,具体可以参考这位博主的文章:

接下来介绍的ComplexHeatmap包就比较全面了,他可以兼容pheatmap函数的所有功能,可以说是pheatmap包的加强版,能够创建更加复杂的热力图,如果你会pheatmap包的应用,那么在ComplexHeatmap包里面,你只需要指明是该包下的pheatmap函数即可使用(ComplexHeatmap::pheatmap())。接下来列举出一些常用参数:

name 、column_title、row_title设置图例、列标题与行标题的名字;

column_title_side &row_title_side 设置列标题与行标题的位置,之注意:列标题只能跟"top"或"buttom"参数,行标题只能跟"left"或"right"参数;

column_names_side &row_names_side 设置行名与列名的位置,后面跟的是位置参数,如"left"、"top"等;

column_names_rot &row_names_rot 设置行名与列名的倾斜角度,后面跟的是角度,如0、30、90等;

column_names_gp &row_names_gp 设置行名与列名的颜色,比如 column_names_gp =gpar(col=rep("red",5))

column_title_gp &row_title_gp 设置列与行标题的颜色,注意:这个需要和聚类分割的数量来决定,要指定row_split &column_split,颜色的设置才能生效;

col 设置渐变的颜色向量参数,这里推荐用RColorBrewer包中的颜色,比如 col = rev(brewer.pal(n = 7, name ="RdYlBu"))

cluster_rows &cluster_columns 表示是否对行列进行聚类,默认是TRUE

cluster_rows &cluster_columns 表示是否对行列进行聚类,默认是TRUE,如果是特定值,则表示对聚类树进行处理;

row_dend_reorder &column_dend_reorder 表示将行或列进行排序,默认是TRUE,所以我们在利用这个包绘制相关系数热力图时,会看到对角线不是1,那么我们就需要检查是否设置了这个参数;

show_column_dend &show_row_dend 表示是否展示行与列的聚类树;

...

下面利用上述随机生成的数据来绘制heatmap:

最值得一提的是,cluster_rows参数,可以结合hlust函数来使用,并通过color_branches函数来为不同类别设置颜色,使得整个heatmap看起来更加美观。如果我们要显示聚类后的数据分割并命名,我们可以这样:

如若想得到更加详细的说明,可以看ComplexHeatmap包的官方文档,或者参见这位博主的文章:

当然,画heatmap怎么能少的了ggplot2呢,我们在利用ggplot画图时,只需要设置scale_fill_gradient即可,例如:scale_fill_gradient(low = "yellow", high = "red") 表示颜色从黄色到红色渐变。注意要把数据处理成ggplot所需要的样式!下面来绘制heatmap:

如果要实现聚类树在heatmap上,我们需要利用ggtree函数,分别绘制聚类树与热力图,最后用aplot包进行拼接即可。

由于ComplexHeatmap包绘制的热力图是一个Heatmap对象,故他与其他图形不同,自身可以与其他Heatmap对象结合,我们只需要利用"+"号或者"%v%"连接符对多个Heatmap对象进行水平或垂直连接就可以了。

当我们需要将pheatmap包绘制的热力图与ggplot画的其他图贴在一起时,我们可以利用ggplotify包来实现,具体操作流程为:

我们用上回利用iris数据集画组合小提琴图的例子,进一步组合heatmap:

当然ggplot也可以画heatmap,这里不再阐述,对于上面几种绘图方案,我们只需选取一种最美观,最有效的方式来画heatmap即可。

1. 安装和加载R包

forestplot包是基于rmeta包的forestplot函数创建的,但是功能更强大,可以对同一标签添加多个置信区间。

install.packages("forestplot") #安装forestplot包

library(forestplot) # 加载包

登录后复制

2. 读取数据

以上图的数据为例,将数据录入到Excel中,录入数据格式如下图所示:

library(readxl) # 加载包

forest "forest.xlsx") # 导入数据

View(forest) # 预览数据

登录后复制

展示部分数据

3. 数据处理

3.1 定义亚组

在论文图片中,为了区分以及显示的更清楚,亚组一般会向前缩进两个空格。

subgps 7,8,9,12,13,14,17,18,19,22,23,24)

# 指定要缩进的亚组,此处向量中的数字表示亚组的行数

forest$Variable[subgps] "",forest$Variable[subgps])

# 亚组前添加两空格

View(forest) # 预览数据看看有没有添加空格

登录后复制

3.2 转换数据格式

attach(forest) # 绑定数据框

labeltext 1:3])

# 将forest数据框的前3列转换为矩阵

# 以矩阵形式将文本数据导入函数

登录后复制

3.3 指定图形数据

分别指定哪些数据是HR、95%CI上限、95%CI下限。

coef # 指定HR数据

low # 指定95%CI下限数据

high # 指定95%CI上限数据

登录后复制

4. 绘制简单图形

forestplot(labeltext, # 森林图文本部分

mean = coef, # 图形元素中HR部分

lower = low, # 图形元素中置信区间下限

upper = high) # 图形元素中置信区间上限

登录后复制

与原图相比,需要修改的地方有很多:

修改坐标轴标签

添加无效线

添加水平线

调整box大小

字体对齐

图形元素的位置

图形元素的颜色

修改坐标轴刻度

添加图例

前面的推文已经介绍了森林图各种参数的调整,因此就直接修改了(点击下面红色链接查看参数介绍)。

R语言统计与绘图:forestplot包绘制森林图

5. 自定义森林图参数

修改坐标轴标签、添加无效线、水平线、调整box大小、字体对齐、图形元素、添加图例、修改坐标轴刻度等直接一起修改啦。

my_xticks 0.004,0.04,0.2,1,5,25,250) # 设置需要显示的x轴刻度

attr(my_xticks, "labels") # 将x轴刻度标签传递给xticks参数

forestplot(labeltext, # 森林图文本部分

mean = coef, # 图形元素中HR部分

lower = low, # 图形元素中置信区间下限

upper = high, # 图形元素中置信区间上限

zero = 1, lwd.zero = 2, # 设置无效线位置和线条宽度

graph.pos = 2, # 设置图形元素的位置

boxsize = 0.5, # 设置box的大小

align = "l", # 设置字体对齐方式

xlog = TRUE, # 设置对数坐标轴

xlab="Mortality", # 添加x轴标签

xticks = my_xticks, # 自定义x轴刻度标签

hrzl_lines = list("2" = gpar(lty=1, columns=c(3:4), col = "black"),

"3" = gpar(lty=1, columns=c(1:4), col = "black")),

# 在第2行和第3行添加水平线,并设置水平线的线型、宽度和颜色

is.summary= c(T,F,T,F,T,F,F,F,F,T,F,F,F,F,T,F,F,F,F,T,F,F,F,F),

# 指定哪些行是summary行

txt_gp = fpTxtGp(label = gpar(cex = 1.15), # 设置文本字体大小

ticks = gpar(cex = 1.20), # 设置坐标轴刻度大小

xlab = gpar(cex = 1.45)), # 设置坐标轴标题大小

# 设置文本标签、刻度、x轴标签的大小

col=fpColors(box=c("#B30638", "#00549E")),

# 设置box的颜色

legend=c("No-AKI", "AKI"), # 设置图例分组

legend_args = fpLegend(pos = list(x =0.20, y=0.05),

r = unit(.1, "snpc")))

# 设置图例位置和大小

登录后复制

如上所示为绘制的森林图,与论文原图基本是一致的,论文原图是没有加上图例的,但是我觉得加上图例显示的更清楚,顺便也学习下森林图图例参数怎么用。

6. 参数解释

森林图的大多数参数在前面的推文中已经介绍的很详细了,这里就不多介绍了(点击下面红色链接可查看参数介绍)。

R语言统计与绘图:forestplot包绘制森林图

这里介绍下前面推文没有介绍的参数。

6.1 对数坐标轴

在forestplot包中,使用xlog参数来设置对数坐标轴,使用xticks参数来自定义坐标轴刻度。

xlog # 逻辑词,默认FALSE,为TRUE则设置坐标轴;

xticks # 自定义设置x轴刻度;

# 在设置为对数坐标轴后,x轴标签可通过下列代码在指定刻度处指定输出文本

my_xticks 0.004,0.04,0.2,1,5,25,250) # 设置需要显示的x轴刻度标签

attr(my_xticks, "labels") # 将x轴刻度标签传递给xticks参数

# 再在forestplot()函数中加入下面代码可自定义指定刻度标签。

xticks = my_xticks

登录后复制

6.2 设置图例

对于有多个置信区间的森林图,可以添加图例来表示不同置信区间。

legend # 字符向量,指定不同置信区间的图例

legend_args # 和fpLegend()函数配合使用设置图例的样式

# fpLegend()函数

legend_args = fpLegend(pos = "top",

gp = NULL,

r = unit(0, "snpc"),

padding = unit(ifelse(!is.null(gp), 3, 0), "mm"),

title = NULL)

# 参数解释

pos # 指定图例的位置;

# 如果图例在图形元素外,则可以设置为"top"或"right";

# 如果需要将图例放在图形元素中,则可以指定x和y来设置位置

# 用法为 pos=list(x=1,y=1),x、y在0-1之间。

gp # 和gpar()函数配合使用,设置图例的边框、背景样式;用法:

gp = gpar(fill = "black", # 设置背景填充颜色

col = "black", # 设置边框颜色

lwd = 2, # 设置边框的线条宽度

lty = 1) # 设置边框的线条类型

r # 可设置图例边框为圆角边缘;snpc为单位,修改前面的数字设置边缘弧度;

padding # 只有绘制图例边框时才生效,设置图例文本到边框的距离,单位为mm

title # 图例的标题

登录后复制

森林图还有一种图形,多个置信区间多个坐标轴的。如下图:

这种森林图,好像没在forestplot包中找到绘制方法,实在需要就单个单个绘制,导出PDF,在AI中合并图形就好了