作图

单细胞差异基因展示图

2022-04-28  本文已影响0人  汪汪队队长_莱德

最近看到一个公众号,分享了一个图片,公众号的名字为西红柿的空间转录组,代码均来着这个公众号,废话不多说,先看看图长什么样


71a9e7f00eb2aa6653909278b1aeddb.png

直接上代码

加载数据与包

library(ggplot2)
library(ggrepel)
library(tidyverse)
library(Seurat)
library(SeuratData)

#载入示例数据
scRNA_harmony <- readRDS("scRNAsub.rds")

再看一下图片,我们要构建一个怎么样的数据 数据里得有什么
在我看来这个图是三个数据的体现
1.图上的点点 这需要一个数据 数据1
2.图上的中间为label的celltype需要一个数据 数据2
3.图上那些note出来的基因需要一个数据 数据3
而他们之间为什么能相互归属,是因为他们之间有相互联系

#开始作图,
#先创建数据2  先得到celltype的label的数据
#由于我们的label是celltype  所以我们要先ident为celltype
Idents(scRNA_harmony) <- "celltype"
levels(scRNA_harmony)    #查看celltype的排列顺序  后面创建的向量要与这个排列顺序对应      
data <- data.frame(x=0:6,  #这里需要根据celltype的类型多少进行改变
                   y=0,
                   label=c(
                     "Macrophages","epithelial cells","Fibroblast",
                     "T cells","Endothelial cells","B cells","Smooth muscle"))   #数据2创建完成


#创建数据1  点点代表基因 高低代表logFC的大小  所以这个表格大致就是FindAllMarkers生成的表格
marker<-FindAllMarkers(scRNA_harmony)

#再观察图片,发现点点(基因)是随机排列的,所以我们要给每一个基因弄一个随机数,好让他们随机排列
#第一步 在marker这个表格中给每一种celltype按照排序给他们定义一个数字0-....
for(i in 1:nrow(data)){
  marker[which(marker$cluster == data$label[i]),'id'] <- data$x[i]
}
marker$id=as.numeric(marker$id)
#第二步  #根据这个数字来创建随机数
marker$x=0
for (i in 0:9) {
  marker[which(marker$id == i),"x"]= i+runif(nrow(marker[which(marker$id == i),]), 
                                             min = -0.4, #为啥0.4,因为1/2=0.5
                                             max = 0.4)
}  #这样数据1就创建好了

#创建数据3  创建这个表格的目的就是显示top基因的名字
#所以是基因marker这个数据 来得到top基因的
marker$p=ifelse(marker$p_val_adj<0.01,"a","b")#设置一个p值的颜色label
top = marker %>% group_by(cluster) %>% top_n(n = 5, wt = avg_log2FC)#前5
bt= marker %>% group_by(cluster) %>% top_n(n = 5, wt = -avg_log2FC)#后5
xx=rbind(top,bt)  #这样数据3就创建好了

#数据1-marker
#数据2-data
#数据3-xx

数据已经创建好了 现在开始画图

#首先,设置颜色,该颜色的排列顺序就是下面label celltype的颜色  所以可以把这个排列顺序调成跟seurat中的celltype的颜色一样
mycol<-c("#223D6C","#D20A13","#FFD121","#088247",
         "#11AA4D","#58CDD9","#7A142C","#5D90BA",
         "#431A3D","#91612D","#6E568C","#E0367A",
         "#D8D155","#64495D","#7CC767")

#画图  先画数据1-marker  主图
p<-ggplot(data = marker, mapping = aes(x = x, 
                                       y = avg_log2FC)) + 
  geom_point(aes(colour = p),size=0.4) +
  scale_color_manual(values = c("red","black"), 
                     labels = c(paste('Adjusted P-val <',0.01),
                                paste('Adjusted P-val >=',0.01)))+
  xlab("") + ylab("average logFC") +
  geom_tile(data = data.frame(x=(0:6),
                              y=0,
                              label=(0:6)),
            aes(x=x,y=y,fill=factor(label),
                height = 0.4))+
  scale_fill_manual(values = mycol)
p

#加上数据2的label 
p2=p+geom_text(data=data ,
               aes(x=x,y=y,label=label),
               color="white")+      #改细胞名字体的颜色  想一下该字体的大小呢   #足以见系统学习gglot有多么重要
  geom_text_repel(data=xx,
                  aes(x = x, 
                      y = avg_log2FC,
                      label=gene),
                  size=3)
p2

#加上数据3的top基因
p2+theme_classic()+
  guides(fill = FALSE,size=FALSE)+
  theme(legend.position = "top",
        axis.text.x = element_blank(),
        axis.line.x = element_blank(),
        axis.ticks.x = element_blank())

马上要放五一了,如坐针毡,心早就飞了,所以来写两篇文章消耗一下时间,放假前的打算(系统的学一下ggplot),我觉得是不可能的........我........

References:跟着Cell学画图~ (qq.com)

上一篇 下一篇

猜你喜欢

热点阅读