最近在画热图(heatmap
)时,除了遇到画热图时导入的基因过多,基因名就会重叠在一起的问题以外,另一个问题就是:👇
希望可以做到热图单个或多个基因表达的比较,同时有放大的效果,突出基因在两组间的表达差异,再以boxplot
的形式展示出来,找遍全网也没有找到解决方案,干脆自己造轮子吧。😘
可能有小伙伴会说,画完两个图,再在AI
里拼上就可以啦,问题是这样不容易对应到基因在热图中的位置了。😭
这里给大家提供一下解决方案吧,全程代码操作,非常简单,只需要提供一个表达矩阵,一个分组文件即可,效果图如下,颜值还是挺高的。🤨
📍
rm(list = ls())
library(tidyverse)
library(circlize)
library(ComplexHeatmap)
library(reshape2)
library(ggsci)
library(ggpubr)
#devtools::install_github('erocoar/ggparl')
library(ggparl)
这里我们随机生成一个矩阵,200
行,20
列。👀
expr <- matrix(rnorm(4000), nrow = 200)
rownames(expr) <- paste0("gene", 1:200)
colnames(expr) <- paste0("sample",1:20)
head(expr)
我们读入一下事先写好的分组文件,这里我将20
个样本分成了两组,即Control
和Disease
组。
group <- read.csv("./group.csv")
group
这里我们先做一下数据的预处理,如归一化、因子转换等,如果你的数据已经做过了,就不用做了。
expr_scaled <- t(scale(t(expr)))
group$Group <- factor(group$Group,unique(group$Group))
group$Group
这里我们需要找到这些基因在原始矩阵的位置,大家把自己想要标记的基因传递给gene
就行了,非常简单。😘
这里我们标记一下gene10
和gene100
。🔍
gene <- c("gene10", "gene100") # 改成你需要标记的基因即可。
genemark <- which(rownames(expr_scaled) %in% gene)
genemark
这里提供一个样本聚类的列注释,如果你不需要可以跳过这一段。🥳
class <- anno_block(
gp = gpar(fill = c("#E64B35E5", "#4DBBD5E5", "#00A087E5", "#3C5488E5"),
col="white"),
height = unit(5, "mm"),
labels = c("Cluster A", "Cluster B", "Cluster C","Cluster D"),
labels_gp = gpar(col = "white", fontsize = 8,fontface="bold")
)
## ========
ha = HeatmapAnnotation(Group = group$Group,
col = list(Group = c("Control" = "#F39B7FB2",
"Disease" = "#91D1C2B2")),
clusters = class
)
Heatmap(expr_scaled,
name = "Expr",
top_annotation = ha,
column_split= 4, # 聚类个数,可以根据自己的需要修改。
column_title = NULL,
show_row_names = F,
show_row_dend = F)
这里也是本次可视化最大的难点,需要画一个基因放大后,两组比较的boxplot
,还需要添加统计值。🤒
这里我写了一个自定义函数,大家几乎不需要更改,如果颜色不满意,或需要修改统计方法,可以见注释进行具体修改。🌟
可试读18%