单细胞Scanpy常用脚本2023-08-28

前言

Scanpy是基于Python语言的类似Seurat的单细胞转录组分析工具,本文汇集了Scanpy的常规操作。

  • 加载模块和设置

import time
print('Start time: ' + time.strftime('%Y-%m-%d %H:%M:%S',time.localtime()))

import numpy as np
import pandas as pd
import scanpy as sc
import louvain

import matplotlib
matplotlib.use('AGG')
import matplotlib.pyplot as plt
from matplotlib import rcParams

sc.settings.verbosity = 3
sc.settings.autosave = True
results_file = './write/81libs.h5ad'
sc.settings.autosave = True
sc.settings.set_figure_params(dpi=300, frameon=False)
  • 读入矩阵

inpath= 'Matrix/scanpy_mat'
adata2 = sc.read_10x_mtx(path, var_names='gene_symbols', cache=True)
adata2.obs['batch1'] = 'C7-4'

adata= sc.read_10x_h5("./matrix.h5", genome=None, gex_only=True)
adata = sc.read_csv('./matrix.tsv',delimiter='\t')
adata = sc.read_h5ad('./result.h5ad')
adata = sc.read('./result.h5ad')
  • 合并多个对象

#load data
adata1 = sc.read("30libs.h5ad")
adata2 = sc.read("22libs.h5ad")
adata3 = sc.read("28libs.h5ad")

nadata1 = adata1.raw.to_adata()
nadata1.obs['batch1'] = adata1.obs['batch']
nadata2 = adata2.raw.to_adata()
nadata2.obs['batch1'] = adata2.obs['batch']
nadata3 = adata3.raw.to_adata()
nadata3.obs['batch1'] = adata3.obs['batch']

datalist = [nadata2, nadata3]
nadata1 = nadata1[nadata1.obs.batch != "C7-4" , :]

path= mat+'C7-4'+'/04.Matrix/scanpy_mat'
datalist.append(sc.read_10x_mtx(path, var_names='gene_symbols', cache=True))
datalist[2].obs['batch1'] = 'C7-4'


path= mat+'C5-2'+'/04.Matrix/scanpy_mat'
datalist.append(sc.read_10x_mtx(path, var_names='gene_symbols', cache=True))
datalist[3].obs['batch1'] = 'C5-2'

adata = nadata1.concatenate(datalist, join='outer')
  • 添加注释

adata.obs['lable'] = "NA"
c=[ i for i, word in enumerate(list(adata.obs['batch1'])) if word.startswith('A') ]
adata.obs['lable'][c]= "A"
c=[ i for i, word in enumerate(list(adata.obs['batch1'])) if word.startswith('B') ]
adata.obs['lable'][c]= "B"
c=[ i for i, word in enumerate(list(adata.obs['batch1'])) if word.startswith('C') ]
adata.obs['lable'][c]= "C"
c=[ i for i, word in enumerate(list(adata.obs['batch1'])) if word.startswith('Y') ]
adata.obs['lable'][c]= "Y"
  • 输出矩阵

#save raw matrix
pd.DataFrame(data=adata.X.todense().T, index=adata.var_names,columns=adata.obs_names).to_csv('raw_mat.csv',sep="\t",
#                                                                                             float_format='%.0f')
print(str(len(datalist)+1)+' datasets were merged!')
  • 质控

#quality control
sc.pp.filter_cells(adata, min_genes=500)
sc.pp.filter_genes(adata, min_cells=3)

adata.var['mt'] = adata.var_names.str.startswith('MT-')
sc.pp.calculate_qc_metrics(adata, qc_vars=['mt'], percent_top=None, log1p=False, inplace=True)

adata.obs['percent_mito'] = adata.obs['pct_counts_mt']
adata.obs['n_counts'] = adata.obs['total_counts']

adata = adata[adata.obs.pct_counts_mt < 10, :]
sc.pl.violin(adata, ['n_genes', 'n_counts', 'percent_mito'],jitter=0.4, multi_panel=True, save='_qc.pdf', stripplot=False)
plt.savefig('./figures/01.22libs_qc.pdf')

sc.pp.calculate_qc_metrics(data, percent_top=None, log1p=False, inplace=True)
sc.pl.violin(data, ['n_genes_by_counts', 'total_counts'],jitter=False, multi_panel=True,stripplot=False)
plt.savefig("QC_violin.pdf")
data = data[data.obs.n_genes < 2500, :]
print(data.obs['n_genes_by_counts'].median(),'\n')
print(data.obs['total_counts'].median(),"\n")
  • 常规聚类

#normalize scale pca umap
sc.pp.normalize_per_cell(adata, counts_per_cell_after=1e4)
sc.pp.log1p(adata)
adata.raw = adata

sc.pp.highly_variable_genes(adata, n_top_genes=3000)
#sc.pl.highly_variable_genes(adata)
adata = adata[:, adata.var['highly_variable']]
sc.pp.regress_out(adata, ['n_counts', 'percent_mito'])
sc.pp.scale(adata, max_value=10)

sc.tl.pca(adata, n_comps=50, random_state=int(2020), svd_solver='arpack')
sc.pp.neighbors(adata, n_neighbors=10, n_pcs=40, random_state=int(2020))
sc.tl.umap(adata, random_state=int(2020))

#cluster
sc.tl.louvain(adata, random_state=int(2020))
sc.pl.umap(adata, color=['louvain'], save='_cluster1.pdf')
sc.pl.umap(adata, color=['lable'], save='_cluster2.pdf')
#plt.savefig('./figures/02.22libs_cluster.pdf')

adata.obs['clusters'] = adata.obs['louvain']
  • 聚类点图

data.obsm['X_umap']=data.obsm['spatial']
sc.pl.umap(data, color=['leiden'])
plt.savefig("Umap2.pdf")
  • 基因表达点图

#plot markers
rcParams['figure.figsize'] = 3,3
marker = ["CD68","CD14","CD163","CD3G","CD4","CD8A"]
marker = [gene for gene in marker if (gene in adata.raw.var._stat_axis.values.tolist())]
sc.pl.umap(adata, color=marker, s=50, frameon=False, ncols=3, vmax='p99', save='_l1.pdf')

rcParams['figure.figsize'] = 3,3
marker = ["RTKN2","CHN2","LRRD1","KIAA0408","CCDC144A"]
marker = [gene for gene in marker if (gene in adata.raw.var._stat_axis.values.tolist())]
sc.pl.umap(adata, color=marker, s=50, frameon=False, ncols=3, vmax='p99', save='_l2.pdf')
  • 保存结果

adata.write(results_file)
adata.obs.to_csv('./write/Scanpy_cell_info.csv', sep='\t', header=True, index=True)

adata.write(results_file, compression='gzip')
  • 找DEG

# Finding marker genes
sc.settings.verbosity = 2
sc.tl.rank_genes_groups(adata, 'louvain', method='wilcoxon')
sc.pl.rank_genes_groups_heatmap(adata, n_genes=10, swap_axes=True, show_gene_labels=True, vmin=-3, vmax=3, cmap='bwr')

result = adata.uns['rank_genes_groups']
groups = result['names'].dtype.names
trgpc = pd.DataFrame({group + '_' + key[:1]: result[key][group] for group in groups for key in ['names', 'scores', 'logfoldchanges','pvals_adj']}).head(20)
trgpc.to_csv(path_or_buf="./write/top20_genes_per_cluster.csv", sep='\t', header=True, index=True)
  • 更改基因名或细胞名

adata.var_names = new_gene_names
adata.obs_names='cell_'+adata.obs_names
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,440评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,814评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,427评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,710评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,625评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,014评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,511评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,162评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,311评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,262评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,278评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,989评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,583评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,664评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,904评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,274评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,856评论 2 339

推荐阅读更多精彩内容