ggplot2版本的热图-方便拼图!

2022-11-15 09:29:30 浏览数 (1)

之前写了8篇推文详细介绍了complexheatmap画热图,大家可以在公众号后台搜索即可看到!

超详细的R语言热图之complexheatmap系列1

前几天介绍了ggplot2版本的韦恩图,说到现在R语言画图都在ggplot2化,热图当然也不能例外!

今天介绍的ggheatmap,国产R包,必须支持!

支持图层语法,也是把热图分为好几个部分,然后再拼起来,得到一个ggplot2对象,最大的好处是方便拼图,因为生信文章里就喜欢把热图和其他图片拼一起。当然用PPT或者PS、AI拼都行,但是也有很多小伙伴喜欢把所有工作都放到R里面做。

  • 安装
  • 简介
  • 使用
  • 自定义热图

安装

代码语言:javascript复制
# 2选1
install.packages("ggheatmap")

devtools::install_github("XiaoLuo-boy/ggheatmap")

简介

代码语言:javascript复制
library(ggheatmap)
## 载入需要的程辑包:ggplot2

主要提供了三大主函数:

  • ggheatmap():画热图的主要函数
  • ggheatmap_theme():设置各组件的主题
  • ggheatmap_plotist():提取热图各组件

github主页上把ggheatmap()这个函数的所有参数都列出来了,大家看看,我就不翻译了,名字非常直观!大家可以通过?ggheatmap随时查阅。

使用

找一份差异基因表达矩阵,标准的表达矩阵即可,行是基因,列是样本。或者自己随便编一个数据。

代码语言:javascript复制
alldiff <- readRDS("../000files/ggheatmap_diffgenes.rds")

dim(alldiff)
## [1] 400 156
alldiff[1:4,1:4]
##              GSM2997711 GSM2997712 GSM2997713 GSM2997714
## LOC100294341    7.21163   7.304075   5.765185    3.98753
## FAM3B           3.38149   3.908970   3.441000    4.80719
## CCL23           4.59639   4.789240   5.040425    3.33198
## AOC1            4.28208   3.624910   4.227660    3.70914

# 方便演示,用部分数据
df <- alldiff[1:80,1:40] # 取80行,40列用于演示

基础使用很简单,都是一些常用的操作,比如标准化,聚类,改变颜色等。

代码语言:javascript复制
# 修改颜色
ggheatmap(df,
          scale = "row", # 标准化
          cluster_rows = TRUE, # 行聚类
          cluster_cols = TRUE, # 列聚类
          legendName = "Gene Expression", # 图例名称
          color = colorRampPalette(c("#2fa1dd", "white", "#f87669"))(100),
          cluster_num = c(2,2),
          tree_color_cols = c("steelblue","darkred"), # 聚类树颜色
          tree_color_rows = c("steelblue","darkred"))

plot of chunk unnamed-chunk-4

接下来给这个热图添加注释条。

代码语言:javascript复制
# 添加列注释条,40列,别搞错
col_anno <- data.frame(group1=sample(LETTERS[1:4],40,replace = T),
                       group2=sample(c("trt","con"),40,replace = T),
                       group3=sample(c("YES","NO"),40,replace = T)
                       )
rownames(col_anno) <- colnames(df)

# 添加行注释条,80行,别搞错
row_anno <- data.frame(info1=sample(c("good","bad"),80,replace = T),
                       info2=sample(c("up","done","none"),80,replace = T)
                       )
rownames(row_anno) <- rownames(df)

# 还需要给各个注释条准备颜色,注意数量要对应
g1_color <- c("#008B45FF","#631879FF","#008280FF","#1F77B4FF")
g2_color <- c("#EE0000FF","#008B45FF")
g3_color <- c("#EE7E80","#5D9AD3")

i1_color <- c("#98D352","#FF7F0E")
i2_color <- c("#EEA236FF","#46B8DAFF","#FF7F0EFF")

col_list <- list(group1 = g1_color,
                 group2 = g2_color,
                 group3 = g3_color,
                 info1 = i1_color,
                 info2 = i2_color
                 )

然后就是添加到热图中:

代码语言:javascript复制
p <- ggheatmap(df,
          scale = "row", # 标准化
          cluster_rows = TRUE, # 行聚类
          cluster_cols = TRUE, # 列聚类
          legendName = "Gene Expression", # 图例名称
          color = colorRampPalette(c("#2fa1dd", "white", "#f87669"))(100),
          cluster_num = c(2,2),
          tree_color_cols = c("steelblue","darkred"), # 聚类树颜色
          tree_color_rows = c("steelblue","darkred"),
          annotation_cols = col_anno,
          annotation_rows = row_anno,
          annotation_color = col_list
          )

p

plot of chunk unnamed-chunk-6

自定义热图

这个热图和前面介绍过的aplot拼热图类似,也是可以拆分成不同部分的,然后可以对每个部件进行自定义,支持ggplot2theme()

代码语言:javascript复制
ggheatmap_plotlist(p)

plot of chunk unnamed-chunk-7

看,是不是很神奇,注释条,主体,legend,聚类树等都拆分出来了。然后就可以用ggplot2语法进行自定义外观了。

而且还支持管道符%>%操作哦!

代码语言:javascript复制
library(magrittr)
p%>%
  ggheatmap_theme(1:5,
                  theme =list(
                    # 热图主体外观
                    theme(axis.text.x = element_text(angle = 45,size = 6,vjust = 1,hjust = 1),
                          axis.text.y = element_text(colour = "red",face = "bold")),
                    
                    # 图例外观
                    theme(legend.title = element_text(face = "bold")),
                    theme(legend.title = element_text(face = "bold")),
                    theme(legend.title = element_text(face = "bold")),
                    theme(legend.title = element_text(face = "bold"))
                    ))

plot of chunk unnamed-chunk-8

怎么样,是不是很赞!还可以进行各种自定义,只要你对ggplot2足够熟悉,就可以进行各种操作,因为本质上就是一个ggplot对象,所以也可以和其他的ggplot图形进行各种组合!

下面是一个小小的例子!

代码语言:javascript复制
library(dplyr)

p2 <- ggplot(row_anno %>% mutate(xx=rownames(row_anno),
                                 value=sample(50:200,80,replace = T)),
             aes(x=value,y=xx,fill=info2)
            ) 
  geom_bar(stat = "identity") 
  scale_fill_manual(values = i2_color,guide=NULL) 
  scale_x_continuous(expand = c(0,0)) 
  labs(x=NULL,y=NULL)

p2

image-20220508113223677

然后就是肆无忌惮的拼图!

代码语言:javascript复制
library(aplot)

p1 %>% insert_right(p2,width = 0.3)

image-20220508113310119

怎么样?你说神奇不神奇!

调包虾的世界就是这么神奇,且好玩!

0 人点赞