这样的图是不是很炫酷,网上的代码动不动就几十块钱一个函数,这里给大家分享一个自力更生版的画法。
首先介绍一下这个图的意思。这个图将不同细胞类型的差异基因分上调与下调的展示,每个细胞类型共有的和特异的分开展示并展示数目。一般认为满足p<0.05 & log2FC > 0.25 为上调,p<0.05 & log2FC < -0.25为下调。如果我们有两组数据,为得到两组比较的差异基因表,我们需要循环取出每一种细胞类型,分别利用FindMarkers函数来寻找差异基因并整合成一个dataframe。
接下来进入代码环节。
首先加载R包与数据。
```swift
library(pheatmap)
library(ComplexHeatmap)
library(ggplot2)
library(dplyr)
data <- read.csv("P0_VS_AD.csv",sep = ",",row.names = 1) %>% .[.$p_val_adj < 0.05,] ###P0与AD是两个时期
data_up <- data[data$avg_log2FC > 0.25,]
data_down <-data[data$avg_log2FC <= -0.25,]
```
得到这样的数据格式:
我的思路是将数据构建成一个table,行是基因,列是细胞类型,如果该基因在该细胞类型中出现,就计数1,这样就生成了一个0 1的列表。每一行就是一个基因,新建一个sum列统计每一行的数目,如果sum为1,则是unique的,剩下的就是共表达的(指该基因只要在两个以上细胞类型出现就是共表达)。
构建dataframe过程如下:
```
up <- as.data.frame.array(table(data_up$gene,data_up$cluster))
up$sum <- apply(up,1,sum)
uniq <- up[up$sum ==1,c(-12)]
same <- up[up$sum !=1,c(-12)]
```
接下来,我们对unique和same分别绘制热图,并利用complexheatmap整合成一张图。
```
p1 <- Heatmap(same,cluster_columns = F,show_row_names = F,border = T,col = c("#ffffff","#e41a1c"),show_row_dend = F,show_heatmap_legend = F)
p2 <- Heatmap(uniq,cluster_columns = F,show_row_names = F,border = T,col = c("#ffffff","#e41a1c"),show_row_dend = F,show_heatmap_legend = F)
p1_p2 = p1 %v% p2
draw(p1_p2)
pdf("P0_CV_UP_num.pdf",width = 6,height = 6)
```
就得到了这样的一张图。
随后,我们来统计信息来用ai等绘图软件加上label。
```
uniq_up <- colSums(uniq) #上调的基因中每个细胞类型中特有的总数
total_uniq_up <- sum(unlist(uniq)) #上调的基因中每个细胞类型特有的基因数目
same_up <- colSums(same) #上调的基因中每个细胞类型中共有的总数
total_same_up <- sum(unlist(same)) #上调的基因中每个细胞类型中共有的基因数目
```
之后添加到图的对应位置即可。这里如果可以直接代码添加上最好,但是懒得搞了~~~
同理,下调的也一样的做法。
```
down <- as.data.frame.array(table(data_down$gene,data_down$cluster))
down$sum <- apply(down,1,sum)
uniq2 <- down[down$sum ==1,c(-12)]
same2 <- down[down$sum !=1,c(-12)]
p1 <- Heatmap(same2,cluster_columns = F,show_row_names = F,border = T,col = c("#ffffff","#0000FF"),show_row_dend = F,show_heatmap_legend = F)
p2 <- Heatmap(uniq2,cluster_columns = F,show_row_names = F,border = T,col = c("#ffffff","#0000FF"),show_row_dend = F,show_heatmap_legend = F)
p1_p2 = p1 %v% p2
draw(p1_p2)
pdf("P0_CV_DOWN_num.pdf",width = 6,height = 6)
draw(p1_p2)
dev.off()
####统计
uniq_down <- colSums(uniq2)
total_uniq_down <- sum(unlist(uniq2))
same_down <- colSums(same2)
total_same_down <- sum(unlist(same2))
```
最后附上成图:
总结:其实就是很简单的热图的利用,没有那么高深莫测~