最近看到一个公众号,分享了一个图片,公众号的名字为西红柿的空间转录组,代码均来着这个公众号,废话不多说,先看看图长什么样
直接上代码
加载数据与包
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)