利用scanpy進(jìn)行單細(xì)胞測(cè)序分析(二)軌跡推斷

這篇文章學(xué)習(xí)scanpy官網(wǎng)的第二部分活尊,這部分介紹了如何使用scanpy進(jìn)行軌跡推斷隶校。
官網(wǎng)地址:https://scanpy-tutorials.readthedocs.io/en/latest/paga-paul15.html

#load數(shù)據(jù),這部分學(xué)習(xí)的數(shù)據(jù)不用下載蛹锰,貌似是scanpy自帶的
>>> import numpy as np
>>> import pandas as pd
>>> import matplotlib.pyplot as pl
>>> from matplotlib import rcParams
>>> import scanpy as sc
>>> sc.settings.verbosity = 3  # verbosity: errors (0), warnings (1), info (2), hints (3)
>>> sc.logging.print_versions()
scanpy==1.4.6 anndata==0.7.1 umap==0.4.1 numpy==1.18.2 scipy==1.4.1 pandas==1.0.3 scikit-learn==0.22.2.post1 statsmodels==0.11.1 python-igraph==0.8.0
>>> results_file = './write/paul15.h5ad'
>>> adata = sc.datasets.paul15()
>>> adata
AnnData object with n_obs × n_vars = 2730 × 3451 
    obs: 'paul15_clusters'
    uns: 'iroot'

數(shù)據(jù)處理與可視化

這里的數(shù)據(jù)處理官網(wǎng)用了scnapy里的一種自帶的處理過程深胳,你也可以使用上一篇文章里的數(shù)據(jù)預(yù)處理方法。關(guān)于這個(gè)zheng17的方法的具體代碼铜犬,可以看單細(xì)胞轉(zhuǎn)錄組數(shù)據(jù)分析|| scanpy教程:PAGA軌跡推斷舞终。這里我就不贅述了。

>>> sc.pp.recipe_zheng17(adata)
running recipe zheng17
normalizing counts per cell
    finished (0:00:00)
extracting highly variable genes
    finished (0:00:00)
normalizing counts per cell
    finished (0:00:00)
    finished (0:00:00)

跑PCA(降維):

>>> sc.tl.pca(adata, svd_solver='arpack')
computing PCA with n_comps = 50
    finished (0:00:00)
#計(jì)算neighbor graph
>>> sc.pp.neighbors(adata, n_neighbors=4, n_pcs=20)
computing neighbors
    using 'X_pca' with n_pcs = 20
    finished: added to `.uns['neighbors']`
    'distances', distances for each pair of neighbors
    'connectivities', weighted adjacency matrix (0:00:02)
>>> sc.tl.draw_graph(adata)
#出圖
>>> sc.pl.draw_graph(adata, color='paul15_clusters', legend_loc='on data')

降低噪音(Denoising the graph)

上圖看起來是不是很亂癣猾?
為了讓上圖看起來有序一點(diǎn),我們?cè)囍昧硪环N方法進(jìn)行降維:diffusion map夸盟。關(guān)于diffusion map降維的介紹上陕,可以參考我之前看視頻做的筆記Single cell RNA-seq data analysis with R視頻學(xué)習(xí)筆記(八)五芝。

>>> sc.tl.diffmap(adata)
computing Diffusion Maps using n_comps=15(=n_dcs)
computing transitions
    finished (0:00:00)
    eigenvalues of transition matrix
    [1.         1.         0.9989645  0.9967852  0.9944013  0.98928535
     0.9882636  0.98712575 0.98383176 0.98297554 0.9789326  0.97689945
     0.9744091  0.9727858  0.9661876 ]
    finished: added
    'X_diffmap', diffmap coordinates (adata.obsm)
    'diffmap_evals', eigenvalues of transition matrix (adata.uns) (0:00:00)
>>> sc.pp.neighbors(adata, n_neighbors=10, use_rep='X_diffmap')
computing neighbors
    finished: added to `.uns['neighbors']`
    'distances', distances for each pair of neighbors
    'connectivities', weighted adjacency matrix (0:00:00)
>>> sc.tl.draw_graph(adata)
drawing single-cell graph using layout 'fa'
WARNING: Package 'fa2' is not installed, falling back to layout 'fr'.To use the faster and better ForceAtlas2 layout, install package 'fa2' (`pip install fa2`).
    finished: added
    'X_draw_graph_fr', graph_drawing coordinates (adata.obsm) (0:00:12)
>>> sc.pl.draw_graph(adata, color='paul15_clusters', legend_loc='on data')

看起來依然很亂渐尿。但官網(wǎng)給出的解釋是:有些分化過程的分支被過度繪制了砖茸。

聚類和PAGA

這里用louvain來進(jìn)行聚類(起始這里不太理解的是凉夯,上一步實(shí)際上已經(jīng)聚類了,而且還標(biāo)記了細(xì)胞類型征绎,但官網(wǎng)這里仍然進(jìn)行了聚類)人柿。
PAGA可以生成粗粒度的可視化圖像 (coarse‐grained visualizations),從而可以簡化單細(xì)胞數(shù)據(jù)的解釋隘截,尤其是在測(cè)序細(xì)胞量大或整合了大量細(xì)胞的情況下婶芭。(參考:https://zhuanlan.zhihu.com/p/108918012

>>> sc.tl.louvain(adata, resolution=1.0)
>>> sc.tl.paga(adata, groups='louvain')
>>> sc.pl.paga(adata, color=['louvain', 'Hba-a2', 'Elane', 'Irf8'])

這一步我的電腦報(bào)錯(cuò)了,顯示AttributeError: module 'matplotlib.cbook' has no attribute 'is_numlike'呵哨。如果你出現(xiàn)了相同的報(bào)錯(cuò),可以嘗試pip unstall matplotlib下載挨务,然后安裝低版本的pip install matplotlib ==2.2.3

>>> sc.pl.paga(adata, color=['louvain', 'Itga2b', 'Prss34', 'Cma1'])

下面對(duì)cluster進(jìn)行注釋:

>>>adata.obs['louvain'].cat.categories
Index(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12',
       '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23'],
      dtype='object')
>>> adata.obs['louvain_anno'] = adata.obs['louvain']
#下面在對(duì)cluster進(jìn)行注釋的時(shí)候,你需要提前知道哪一個(gè)cluster表達(dá)干細(xì)胞的基因鸿摇,或者表達(dá)lineage特異基因。這里我就先隨便標(biāo)注了
>>> adata.obs['louvain_anno'].cat.categories = ['1/Stem', '2', '3', '4', '5', '6', '7', '8', '9', '10/Ery', '11', '12','13', '14', '15', '16', '17', '18', '19/Neu', '20/Mk', '21', '22/Baso', '23', '24/Mo']
#注釋
>>> sc.tl.paga(adata, groups='louvain_anno')
running PAGA
    finished: added
    'paga/connectivities', connectivities adjacency (adata.uns)
    'paga/connectivities_tree', connectivities subtree (adata.uns) (0:00:00)
#出圖
>>> sc.pl.paga(adata, threshold=0.03)

利用PAGA初始化重新計(jì)算embedding

>>> sc.tl.draw_graph(adata, init_pos='paga')
#畫marker基因
>>> sc.pl.draw_graph(adata, color=['louvain_anno', 'Itga2b', 'Prss34', 'Cma1'], legend_loc='on data')

把上圖改顏色:

>>> pl.figure(figsize=(8, 2))
>>> for i in range(28):
    pl.scatter(i, 1, c=sc.pl.palettes.zeileis_28[i], s=200)
>>> pl.show()
這樣新的顏色必逆,每一種都有編號(hào)
>>> zeileis_colors = np.array(sc.pl.palettes.zeileis_28)
>>> new_colors = np.array(adata.uns['louvain_anno_colors'])
#把擬時(shí)間上每一個(gè)點(diǎn)重新分配顏色
>>> new_colors[[0]] = zeileis_colors[[12]]  
>>> new_colors[[2, 4, 12, 15, 11, 3, 7, 18, 10]] = zeileis_colors[[2, 3, 9, 10, 10, 11, 11, 5, 5]] 
>>> new_colors[[8, 20]] = zeileis_colors[[16, 17]] 
>>> new_colors[[17]] = zeileis_colors[[25]]  
>>> new_colors[[16]] = zeileis_colors[[18]]  
>>> new_colors[[19, 5, 6, 9]] = zeileis_colors[[8, 7, 6, 0]]  
>>> new_colors[[1, 13, 14, 21]] = zeileis_colors[[27, 27, 27, 27]]  
>>> new_colors[[22, 23]] = zeileis_colors[[1, 1]] 
>>> adata.uns['louvain_anno_colors'] = new_colors
>>> sc.pl.paga_compare(
    adata, threshold=0.03, title='', right_margin=0.2, size=10, edge_width_scale=0.5,
    legend_fontsize=12, fontsize=12, frameon=False, edges=True, save=True)

利用已知的基因集重構(gòu)PAGA Paths上的基因變化

首先確定擬時(shí)間上的root:

>>> adata.uns['iroot'] = np.flatnonzero(adata.obs['louvain_anno']  == '1/Stem')[0]
>>> sc.tl.dpt(adata)
computing Diffusion Pseudotime using n_dcs=10
    finished: added
    'dpt_pseudotime', the pseudotime (adata.obs) (0:00:00)
#給定一組已知的marker基因
#Select some of the marker gene names.
>>> gene_names = ['Gata2', 'Gata1', 'Klf1', 'Epor', 'Hba-a2',  # erythroid
              'Elane', 'Cebpe', 'Gfi1',                    # neutrophil
              'Irf8', 'Csf1r', 'Ctsg']                     # monocyte
#Use the full raw data for visualization.
>>> adata_raw = sc.datasets.paul15()
>>> sc.pp.log1p(adata_raw)
>>> sc.pp.scale(adata_raw)
>>> adata.raw = adata_raw
>>> sc.pl.draw_graph(adata, color=['louvain_anno', 'dpt_pseudotime'], legend_loc='on data')
#你可以定義每一條lineage是通過哪一條途徑發(fā)育的
>>> paths = [('erythrocytes', [1, 3, 5, 13, 12, 16, 4, 8]),
         ('neutrophils', [1, 20, 2, 14, 15, 22]),
         ('monocytes', [1, 20, 6, 7, 10])]
>>> adata.obs['distance'] = adata.obs['dpt_pseudotime']
>>> adata.obs['clusters'] = adata.obs['louvain_anno']  # just a cosmetic change
>>> adata.uns['clusters_colors'] = adata.uns['louvain_anno_colors']
!mkdir write
>>> _, axs = pl.subplots(ncols=3, figsize=(6, 2.5), gridspec_kw={'wspace': 0.05, 'left': 0.12})
>>> pl.subplots_adjust(left=0.05, right=0.98, top=0.82, bottom=0.2)
>>> for ipath, (descr, path) in enumerate(paths):
    _, data = sc.pl.paga_path(
        adata, path, gene_names,
        show_node_names=False,
        ax=axs[ipath],
        ytick_fontsize=12,
        left_margin=0.15,
        n_avg=50,
        annotations=['distance'],
        show_yticks=True if ipath==0 else False,
        show_colorbar=False,
        color_map='Greys',
        groups_key='clusters',
        color_maps_annotations={'distance': 'viridis'},
        title='{} path'.format(descr),
        return_data=True,
        show=False)
    data.to_csv('./write/paga_path_{}.csv'.format(descr))
>>> pl.savefig('./figures/paga_path_paul15.pdf')
>>> pl.show()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載福压,如需轉(zhuǎn)載請(qǐng)通過簡信或評(píng)論聯(lián)系作者荆姆。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市仆救,隨后出現(xiàn)的幾起案子彤蔽,更是在濱河造成了極大的恐慌顿痪,老刑警劉巖员魏,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異虏束,居然都是意外死亡镇匀,警方通過查閱死者的電腦和手機(jī)汗侵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來熟妓,“玉大人起愈,你說我怎么就攤上這事官觅$趾铮” “怎么了滑绒?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵弯菊,是天一觀的道長钦铁。 經(jīng)常有香客問我佛点,道長,這世上最難降的妖魔是什么演闭? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任购城,我火速辦了婚禮米诉,結(jié)果婚禮上史侣,老公的妹妹穿的比我還像新娘。我一直安慰自己税朴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著杈绸,像睡著了一般塑娇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上奇瘦,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天邑跪,我揣著相機(jī)與錄音,去河邊找鬼轴踱。 笑死淫僻,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的悯辙。 我是一名探鬼主播躲撰,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼瓤狐,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼础锐!你這毒婦竟也來了拦宣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎外驱,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瓦哎,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡卒落,尸身上長有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
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧通贞,春花似錦捡偏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至娄帖,卻和暖如春近速,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人挂捅。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像蒙谓,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谤专,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

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