利用scanpy进行单细胞测序分析(二)轨迹推断

这篇文章学习scanpy官网的第二部分,这部分介绍了如何使用scanpy进行轨迹推断。
官网地址:https://scanpy-tutorials.readthedocs.io/en/latest/paga-paul15.html

#load数据,这部分学习的数据不用下载,貌似是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'

数据处理与可视化

这里的数据处理官网用了scnapy里的一种自带的处理过程,你也可以使用上一篇文章里的数据预处理方法。关于这个zheng17的方法的具体代码,可以看单细胞转录组数据分析|| 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)
#计算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)

上图看起来是不是很乱?
为了让上图看起来有序一点,我们试着用另一种方法进行降维:diffusion map。关于diffusion map降维的介绍,可以参考我之前看视频做的笔记Single cell RNA-seq data analysis with R视频学习笔记(八)

>>> 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')

看起来依然很乱。但官网给出的解释是:有些分化过程的分支被过度绘制了。

聚类和PAGA

这里用louvain来进行聚类(起始这里不太理解的是,上一步实际上已经聚类了,而且还标记了细胞类型,但官网这里仍然进行了聚类)。
PAGA可以生成粗粒度的可视化图像 (coarse‐grained visualizations),从而可以简化单细胞数据的解释,尤其是在测序细胞量大或整合了大量细胞的情况下。(参考: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'])

这一步我的电脑报错了,显示AttributeError: module 'matplotlib.cbook' has no attribute 'is_numlike'。如果你出现了相同的报错,可以尝试pip unstall matplotlib下载,然后安装低版本的pip install matplotlib ==2.2.3

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

下面对cluster进行注释:

>>>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']
#下面在对cluster进行注释的时候,你需要提前知道哪一个cluster表达干细胞的基因,或者表达lineage特异基因。这里我就先随便标注了
>>> 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初始化重新计算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()
这样新的颜色,每一种都有编号
>>> zeileis_colors = np.array(sc.pl.palettes.zeileis_28)
>>> new_colors = np.array(adata.uns['louvain_anno_colors'])
#把拟时间上每一个点重新分配颜色
>>> 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)

利用已知的基因集重构PAGA Paths上的基因变化

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

推荐阅读更多精彩内容