單細(xì)胞轉(zhuǎn)錄數(shù)據(jù)分析之Scanpy

Scanpy 是一個(gè)基于 Python 分析單細(xì)胞數(shù)據(jù)的軟件包争群,內(nèi)容包括預(yù)處理峰弹,可視化距境,聚類,擬時(shí)序分析和差異表達(dá)分析等垮卓。
https://genomebiology.biomedcentral.com/articles/10.1186/s13059-017-1382-0
https://scanpy.readthedocs.io/en/stable/tutorials.html#integrating-datasets
有人可能會(huì)說(shuō):?jiǎn)渭?xì)胞分析使用Seurat垫桂,monocle等R包會(huì)更加方便。但是實(shí)際分析中粟按,當(dāng)單細(xì)胞數(shù)據(jù)過(guò)多時(shí)诬滩,Seurat和monocle會(huì)產(chǎn)生內(nèi)存不足的問(wèn)題,尤其是monocle2灭将,單細(xì)胞數(shù)據(jù)大于50k的時(shí)候疼鸟,往往會(huì)產(chǎn)生內(nèi)存不足,即使是在服務(wù)器上運(yùn)行庙曙。而基于python的單細(xì)胞轉(zhuǎn)錄分析包scanpy空镜,能很好的解決內(nèi)存不足的問(wèn)題,根據(jù)官網(wǎng)說(shuō)明捌朴,scanpy可以解決超過(guò)1,000,000個(gè)單細(xì)胞的數(shù)據(jù)集吴攒,這是基于R分析包不敢想象的。(Seurat:https://satijalab.org/seurat/articles/pbmc3k_tutorial.html)

單細(xì)胞轉(zhuǎn)錄數(shù)據(jù)分析之Scanpy:http://www.reibang.com/p/e22a947e6c60
單細(xì)胞轉(zhuǎn)錄組之Scanpy - 軌跡推斷/擬時(shí)序分析:http://www.reibang.com/p/0b2ca0e0b544
單細(xì)胞轉(zhuǎn)錄組之Scanpy - 樣本整合分析:http://www.reibang.com/p/beef8a8be360
單細(xì)胞空間轉(zhuǎn)錄分析之Scanpy:
單細(xì)胞空間轉(zhuǎn)錄分析之Scanpy-結(jié)合單細(xì)胞轉(zhuǎn)錄組:

Fig1. 網(wǎng)址主頁(yè)

這兒將系統(tǒng)全面演示了如何使用Scanpy來(lái)處理單細(xì)胞轉(zhuǎn)錄組學(xué)數(shù)據(jù)砂蔽。

scanpy相關(guān)python 包安裝(安裝好python3之后洼怔,終端運(yùn)行):

pip install scanpy==1.6.1 -i https://pypi.doubanio.com/simple/

數(shù)據(jù)下載,這兒我們使用了Seurat官網(wǎng)使用的pbmc3k數(shù)據(jù)進(jìn)行測(cè)試(我是很早之前就下載過(guò)了):

wget http://cf.10xgenomics.com/samples/cell-exp/1.1.0/pbmc3k/pbmc3k_filtered_gene_bc_matrices.tar.gz -O data/pbmc3k_filtered_gene_bc_matrices.tar.gz
tar -xzf pbmc3k_filtered_gene_bc_matrices.tar.gz

運(yùn)行python3左驾,導(dǎo)入相關(guān)包:

import scanpy as sc
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
sc.settings.verbosity = 3 # verbosity 的取值表示測(cè)試結(jié)果顯示的詳細(xì)程度镣隶,數(shù)字越大越詳細(xì)
sc.logging.print_versions() # 輸出版本號(hào)
sc.settings.set_figure_params(dpi=80) # set_figure_params 設(shè)置圖片的分辨率/大小以及其他樣式
import os #在服務(wù)器運(yùn)行,習(xí)慣性會(huì)設(shè)置一個(gè)輸出路徑诡右,用于保存pdf圖片
os.getcwd()  #查看當(dāng)前路徑
os.chdir('./filtered_gene_bc_matrices/scanpy') #修改路徑
os.getcwd()
results_file = 'pbmc3k.h5ad' ##置結(jié)果文件保存路徑

讀取并查看數(shù)據(jù):

# 導(dǎo)入 10X 數(shù)據(jù)
data=sc.read_10x_mtx('./filtered_gene_bc_matrices/hg19/',var_names='gene_symbols',   cache=True)
data.var_names_make_unique()  # 索引去重安岂,若上一步中使用 `var_names='gene_ids'` 則這一步非必須進(jìn)行
#data.X 存儲(chǔ) count matrix,數(shù)據(jù)類型為稀疏矩陣 scipy.sparse.csr.csr_matrix
#data.obs 存儲(chǔ)關(guān)于 obervations(cells) 的 metadata帆吻,數(shù)據(jù)類型為 dataframe
#data.var 存儲(chǔ)關(guān)于 variables(genes) 的 metadata域那,數(shù)據(jù)類型為 dataframe
#AnnData.uns 存儲(chǔ)后續(xù)附加的其他非結(jié)構(gòu)化信息
#data.obs_names 和 adata.var_names index
#細(xì)胞名和基因名可分別通過(guò) adata.obs_names 和 adata.var_names 查看。 AnnData 對(duì)象可以像 dataframe 一樣進(jìn)行切片操作桅锄,例如琉雳,data_subset = data[:, list_of_gene_names]
# 當(dāng)然scanpy可以直接讀取10Xgenomics的.h5格式數(shù)據(jù)
data=sc.read_10x_h5("./pbmc3K.h5",genome=None,gex_only=True)
adata.var_names_make_unique()`

數(shù)據(jù)預(yù)處理(基因細(xì)胞過(guò)濾):

可視化所有細(xì)胞中計(jì)數(shù)最多的基因样眠。我們可以看到前20個(gè)基因中有14個(gè)基因是屬于核糖體基因友瘤,說(shuō)明核糖體基因在這此數(shù)據(jù)集中表達(dá)豐度很高,有時(shí)候我們會(huì)去除核糖體占比過(guò)高的細(xì)胞檐束,認(rèn)為這些細(xì)胞質(zhì)量低辫秧,這兒我們先不考慮核糖體基因,考慮線粒體相關(guān)基因被丧。

sc.pl.highest_expr_genes(data, n_top=20)
plt.savefig("Highest_expr_genes.pdf")
#基礎(chǔ)過(guò)濾:去除表達(dá)基因200以下的細(xì)胞盟戏;去除在3個(gè)細(xì)胞以下表達(dá)的基因绪妹。
sc.pp.filter_cells(data, min_genes=200)
sc.pp.filter_genes(data, min_cells=3)`
高表達(dá)基因top 20

計(jì)算線粒體基因占所有基因的比例

mito_genes=data.var_names.str.startswith('MT-')
data.obs['percent_mito']=np.sum(data[:,mito_genes].X,axis=1).A1/np.sum(data.X,axis=1).A1
data.obs['n_counts']=data.X.sum(axis=1).A1
sc.pl.violin(data, ['n_genes', 'n_counts', 'percent_mito'],jitter=0.4, multi_panel=True)
plt.savefig("QC_violin.pdf")
sc.pl.scatter(data, x='n_counts', y='percent_mito')
plt.savefig("QC_dot.pdf")
sc.pl.scatter(data,x='n_counts',y='n_genes')
plt.savefig("QC_dot1.pdf")
##過(guò)濾線粒體基因比例 > 5% 和基因總數(shù) >2500 的細(xì)胞。
data = data[data.obs.n_genes < 2500, :]
data = data[data.obs.percent_mito < 0.05, :]

數(shù)據(jù)預(yù)處理(標(biāo)準(zhǔn)化柿究,挑選HVG基因)

sc.pp.normalize_total(data, target_sum=1e4) ##標(biāo)準(zhǔn)化
sc.pp.log1p(data)
data.raw = data
sc.pp.highly_variable_genes(data, min_mean=0.0125, max_mean=3, min_disp=0.5)
sc.pl.highly_variable_genes(data)
plt.savefig("highly_variable_genes.pdf")
data = data[:, data.var.highly_variable] 
sc.pp.regress_out(data, ['n_counts', 'percent_mito']) #校正細(xì)胞基因計(jì)數(shù)和線粒體基因比例的影響邮旷。
sc.pp.scale(data, max_value=10)
HVG基因的挑選

PCA降維,聚類蝇摸,Umap可視化

sc.tl.pca(data, svd_solver='arpack')# svd_solver 指定奇異值分解 SVD 的方法
sc.pl.pca_variance_ratio(data, log=True)
plt.savefig("PCA.pdf")
data.write(results_file)
sc.pp.neighbors(data, n_neighbors=10, n_pcs=40)
sc.tl.leiden(data) #使用leiden進(jìn)行聚類婶肩,注意安裝對(duì)應(yīng)的python包,conda install -c conda-forge leidenalg 貌夕,當(dāng)然也可使用其他的聚類算法律歼,如louvain,sc.tl.louvain(data),sc.pl.umap(adata, color=['louvain'])啡专,比較了一下险毁,聚類結(jié)果差異不大
sc.tl.umap(data)
sc.pl.umap(data, color=['leiden'])
plt.savefig("Umap.pdf")
data.write(results_file)
PC得分

預(yù)測(cè)簇 marker genes

sc.tl.rank_genes_groups(data, 'leiden', method='wilcoxon')
sc.pl.rank_genes_groups(data, n_genes=30, sharey=False)
plt.savefig("dif_gene.pdf")
data.write(results_file)
cluster 相關(guān)差異表達(dá)基因
umap圖
data = sc.read(results_file)
pd.DataFrame(data.uns['rank_genes_groups']['names']).head(5)
data.uns['rank_genes_groups'].keys()
#dict_keys(['logfoldchanges', 'names', 'params', 'pvals', 'pvals_adj', 'scores'])
result = data.uns['rank_genes_groups']
groups = result['names'].dtype.names
pd.DataFrame(    {group + '_' + key[:1]: result[key][group]    for group in groups for key in ['names', 'pvals']}).head(5)
res = pd.DataFrame(    {group + '_' + key: result[key][group]    for group in groups for key in ['names', 'pvals','logfoldchanges','pvals_adj','scores']})
res.to_csv("dif.csv") #基因差異情況輸出到本地保存
Top5 marker genes

Top5 marker genes

當(dāng)然任意兩個(gè)簇之間也可以比較差異:

sc.tl.rank_genes_groups(data, 'leiden', groups=['0'], reference='1', method='wilcoxon') #cluster0 與 cluster1之間進(jìn)行比較
sc.pl.rank_genes_groups(data, groups=['0'], n_genes=20)
plt.savefig("gene_exp_C0_C1_score.pdf")
sc.pl.rank_genes_groups_violin(data, groups='0', n_genes=8)
plt.savefig("gene_exp_C0_C1_vio.pdf")
data = sc.read(results_file)
sc.pl.rank_genes_groups_violin(data, groups='0', n_genes=8)
plt.savefig("gene_exp_C0_all_vio.pdf")

任意基因表達(dá)可視化(小提琴圖、umap)

sc.pl.violin(data, ['MS4A1', 'NKG7', 'PPBP'], groupby='leiden')
plt.savefig("marker_exp_Vio.pdf")
sc.pl.umap(data, color=['MS4A1', 'NKG7', 'PPBP'])
plt.savefig("marker_exp_umap.pdf")
基因表達(dá)小提琴圖
基因表達(dá)Umap圖

從之前的Seurat分析中们童,我們可以了解pbmc包含的一些細(xì)胞類別的已知marker gene:

pbmc已知的細(xì)胞類別及marker genes

我們可以清晰的看到B細(xì)胞相關(guān)的MS4A1在簇2中表達(dá)畔况,因此我們可以定于這簇為B細(xì)胞,同樣的NKG7在簇4表達(dá)最高慧库,簇4為NK細(xì)胞问窃。

確定細(xì)胞類別,打上細(xì)胞類別標(biāo)簽完沪,繪制已知marker gene的小提琴圖

marker_genes = ['IL7R', 'CD14', 'LYZ',  'MS4A1', 'CD8A', 'CD8B', 'FCGR3A', 'MS4A7','GNLY', 'NKG7', 'FCER1A', 'CST3', 'PPBP']
new_cluster_names = ['CD4 T', 'CD14 Monocytes','B', 'CD8 T','NK', 'FCGR3A Monocytes','Dendritic', 'Megakaryocytes']
data.rename_categories('leiden', new_cluster_names)
sc.pl.umap(data, color='leiden', legend_loc='on data', title='', frameon=True)
plt.savefig("umap_celltype.pdf")
ax = sc.pl.dotplot(data, marker_genes, groupby='leiden')
plt.savefig("gene_Dot_celltype.pdf")
ax = sc.pl.stacked_violin(data, marker_genes, groupby='leiden', rotation=90)
plt.savefig("gene_Vio_celltype.pdf")
Umap -celltype

用已知的細(xì)胞類別標(biāo)簽替換原始分簇域庇。


在不同細(xì)胞類別中marker gene表達(dá)點(diǎn)圖

已知的marker genes在類別中的表達(dá)情況,我們可以明顯的看出這些marker genes在不同簇中特異表達(dá)覆积。


在不同細(xì)胞類別中marker gene表達(dá)小提琴圖
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末听皿,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子宽档,更是在濱河造成了極大的恐慌尉姨,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吗冤,死亡現(xiàn)場(chǎng)離奇詭異又厉,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)椎瘟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)覆致,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人肺蔚,你說(shuō)我怎么就攤上這事煌妈。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵璧诵,是天一觀的道長(zhǎng)汰蜘。 經(jīng)常有香客問(wèn)我,道長(zhǎng)之宿,這世上最難降的妖魔是什么族操? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮比被,結(jié)果婚禮上坪创,老公的妹妹穿的比我還像新娘。我一直安慰自己姐赡,他們只是感情好莱预,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著项滑,像睡著了一般依沮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上枪狂,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天危喉,我揣著相機(jī)與錄音,去河邊找鬼州疾。 笑死辜限,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的严蓖。 我是一名探鬼主播薄嫡,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼颗胡!你這毒婦竟也來(lái)了毫深?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤毒姨,失蹤者是張志新(化名)和其女友劉穎哑蔫,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體弧呐,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡闸迷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了俘枫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腥沽。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖崩哩,靈堂內(nèi)的尸體忽然破棺而出巡球,到底是詐尸還是另有隱情言沐,我是刑警寧澤邓嘹,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布酣栈,位于F島的核電站,受9級(jí)特大地震影響汹押,放射性物質(zhì)發(fā)生泄漏矿筝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一棚贾、第九天 我趴在偏房一處隱蔽的房頂上張望窖维。 院中可真熱鬧,春花似錦妙痹、人聲如沸铸史。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)琳轿。三九已至,卻和暖如春耿芹,著一層夾襖步出監(jiān)牢的瞬間崭篡,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工吧秕, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留琉闪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓砸彬,卻偏偏與公主長(zhǎng)得像颠毙,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子砂碉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容