1.背景
单细胞数据分析在进行完细胞自聚类或者细胞类型注释后,一般需要对查到的差异基因可视化,用来显示基因和细胞群的相关性,进行后续分析。当然Seurat和scanpy本身可视化的方式有非常多,例如feature plot, violin plot, dot plot等,但是问题在于差异基因分析后,如何快速将每个细胞簇所对应的top deg汇总,然后再对接函数绘制成图像。
Seurat的操作比较简单,因为FindMarker()
后自身生成的就是一个数据框,但scanpy的sc.tl.rank_genes_groups()
就没有那么用户友好了。
2.Seurat的实现
library(Seurat)
library(ggplot2)
library(dplyr)
deg<-FindAllMarker(data) #首先差异基因分析获取每个细胞簇的deg
top5 <- deg %>% group_by(cluster) %>% slice_max(order_by = avg_log2FC,n = 5) #提取top差异基因,这里n=5代表top5
mark <- unique(top5$gene) #当然,这里可以是自己选的markers,来自背景知识的细胞标志物
p=DotPlot(kc,features = marker)
p
# 上面已经绘制完成了,下面这步只是纯粹地气泡图美化(可选)
p+ggtitle('there is the title')+theme(axis.text.x = element_text(angle = 45, hjust = 1,size = 10),#x轴标识
axis.text.y = element_text(size = 10),#y轴标识
legend.text = element_text(size= 10),legend.title= element_text(size= 10),#设置legend
plot.title = element_text(hjust = 0.5,size = 12))+#设置标题居中
scale_colour_gradientn(colours = viridis::viridis(20))#修改成为CNS配色
基本的流程是非常简单的:差异基因分析——分组提取top DEG——可视化
至于需要其他可视化方式也是一样的,只需要在可视化这步进行微调即可。
3.scanpy的实现
这一部分是我写这篇简书的主要目的,主要是因为我自己在分析的时候刚好需要,但是scanpy又不大熟悉,而且scanpy确实远不如Seurat用户友好,好多函数的结果都直接存放在adata本身里面,提取比较麻烦。而且python主要都是pandas的操作,所以数据处理的随意性还不如R。
import scanpy as sc
import pandas as pd
import numpy as np
# find all degs
sc.tl.rank_genes_groups(adata, groupby='leiden', method='t-test')
celltype=adata.obs['leiden'].unique().tolist() #把所有细胞簇种类拿出来
deg=sc.get.rank_genes_groups_df(adata,group=celltype) #把所有细胞簇对应的deg拿出来
deg.to_csv('./spGCN_deg.CSV') #存储备份
top=deg.groupby('group')
top5=[] #同样以top5举例
for i in range(len(celltype)): #分群提取top5
tmp=top.get_group(str(i))
tmp=tmp.sort_values('scores',ascending=False) #按scores排序
top5.append(tmp['names'].head(5).tolist())
#array list 转为 list
top5=np.array(top5)
top5=np.reshape(top5,5*len(celltype),'C').tolist()
# visualization
sc.pl.dotplot(adata, top5, groupby='leiden')
plt.savefig('./top5_dotplot.png')
其实思路是一样的,就是python/scanpy的提取top deg这步弯弯绕绕的,比较麻烦。而且实际的运行过程中,也发现scanpy的差异基因分析方法其实不如Seurat,找出来的DEG大多特异性不高,就比较奇怪,这点需要留意。