利用scanpy进行单细胞测序分析(三)Marker基因的可视化

其实这一部分在前面就已经涉及到一些,不过官网既然把这部分拿出来单独作为一大块讲解,可能也是因为这一部分可供选择的可视化方法有很多。对于图片的优化上也有比较详细的介绍。

官网这部分讲解的地址:https://scanpy-tutorials.readthedocs.io/en/latest/visualizing-marker-genes.html

开始之前需要注意一点的是,这部分官网分别使用了marker 基因和高变基因,来进行可视化。所以看上去好像来来回回都是那么几张图,但实际上前半部分展示的是特定细胞群的marker基因的可视化。而后半部分展示的是每一个cluster里的高变基因的可视化。

#调用软件,设置参数
>>> import scanpy as sc
>>> import pandas as pd
>>> from matplotlib import rcParams

>>> sc.set_figure_params(dpi=80, color_map='viridis')
>>> sc.settings.verbosity = 2
>>> 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 louvain==0.6.1

这一部分练习的数据来自10x PBMC 68k数据库。这个dataset已经被过滤了,包含700个细胞和765个高变基因。另外,这个dataset也已经经过PCA和UMAP计算。louvain方法聚类和细胞周期检测的结果都存放在了pbmc.obs里:

#你不需要下载,直接导入数据
>>> pbmc = sc.datasets.pbmc68k_reduced()
>>> pbmc
AnnData object with n_obs × n_vars = 700 × 765 
    obs: 'bulk_labels', 'n_genes', 'percent_mito', 'n_counts', 'S_score', 'G2M_score', 'phase', 'louvain'
    var: 'n_counts', 'means', 'dispersions', 'dispersions_norm', 'highly_variable'
    uns: 'bulk_labels_colors', 'louvain', 'louvain_colors', 'neighbors', 'pca', 'rank_genes_groups'
    obsm: 'X_pca', 'X_umap'
    varm: 'PCs'

可以看到这个AnnData对象已经是一个预处理相当全面的dataset了,这一章也是主要介绍经过前期处理后,有哪些方法可以让你的data很漂亮的展示出来。
可以看一下UMAP的图:

#用rcParams修改图片的默认大小
>>> rcParams['figure.figsize'] = 4, 4
>>> sc.pl.umap(pbmc, color=['bulk_labels'], s=50)

给定一个marker基因的list:

>>> marker_genes = ['CD79A', 'MS4A1', 'CD8A', 'CD8B', 'LYZ',  'LGALS3', 'S100A8', 'GNLY', 'NKG7', 'KLRB1','FCGR3A', 'FCER1A', 'CST3']

小提琴图

画在每一个cluster里这些marker基因的表达情况:

>>> ax = sc.pl.stacked_violin(pbmc, marker_genes, groupby='bulk_labels',
                         var_group_positions=[(7, 8)],var_group_labels=['NK'])
#可以看一下上面代码里bulk_labels里是什么:
>>> print(pbmc.obs['bulk_labels'])
index
AAAGCCTGGCTAAC-1     CD14+ Monocyte
AAATTCGATGCACA-1          Dendritic
AACACGTGGTCTTT-1           CD56+ NK
AAGTGCACGTGCTA-1    CD4+/CD25 T Reg
ACACGAACGGAGTG-1          Dendritic
                         ...       
TGGCACCTCCAACA-8          Dendritic
TGTGAGTGCTTTAC-8          Dendritic
TGTTACTGGCGATT-8    CD4+/CD25 T Reg
TTCAGTACCGGGAA-8            CD19+ B
TTGAGGTGGAGAGC-8          Dendritic
Name: bulk_labels, Length: 700, dtype: category
Categories (10, object): [CD4+/CD25 T Reg, CD4+/CD45RA+/CD25- Naive T, CD4+/CD45RO+ Memory, CD8+ Cytotoxic T, ..., CD19+ B, CD34+, CD56+ NK, Dendritic]

你还可以将x轴和y轴交换,这样就是每一个marker基因在所有cluster里的表达情况:

>>> ax = sc.pl.stacked_violin(pbmc, marker_genes, groupby='bulk_labels', swap_axes=True, var_group_positions=[(7, 8)], var_group_labels=['NK'], dendrogram=True)

点图

只有当你的count矩阵里有0的时候才有意义,点图不适用于那些已经被矫正过不存在0的矩阵。

Marker基因可以是列表,也可以是字典。如果存为字典,你画出的图将会被分组并标记:

>>> marker_genes_dict = {'B-cell': ['CD79A', 'MS4A1'],
                     'T-cell': 'CD3D',
                     'T-cell CD8+': ['CD8A', 'CD8B'],
                     'NK': ['GNLY', 'NKG7'],
                     'Myeloid': ['CST3', 'LYZ'],
                     'Monocytes': ['FCGR3A'],
                     'Dendritic': ['FCER1A']}
# use marker genes as dict to group them
>>> ax = sc.pl.dotplot(pbmc, marker_genes_dict, groupby='bulk_labels')

为了让上面的图更加能清楚的表达我们data的内容,可以加点东西进去:
(1)dendrogram=True:在图里加入树状图,也就是分支图。
(2)dot_max=0.5 最大的点设置为0.5,基因表达量大于50%的都用这个型号的点表示
(3)dot_min=0.3 最小的点设置为0.3,基因表达量小于30%的都用这个型号
(4)standard_scale=’var’ 对矩阵进行scale矫正(0-1)

>>> ax = sc.pl.dotplot(pbmc, marker_genes, groupby='bulk_labels', dendrogram=True, dot_max=0.5, dot_min=0.3, standard_scale='var')

上图还可以换颜色,改变图片大小:

>>> ax = sc.pl.dotplot(pbmc, marker_genes_dict, groupby='bulk_labels', dendrogram=True,
                   standard_scale='var', smallest_dot=40, color_map='Blues', figsize=(8,5))

给基因加上group标签:

>>> ax = sc.pl.dotplot(pbmc, marker_genes, groupby='louvain',
              var_group_positions=[(0,1), (11, 12)],
              var_group_labels=['B cells', 'dendritic'],
              figsize=(12,4), var_group_rotation=0, dendrogram='dendrogram_louvain')

矩阵图

矩阵图以热图的形式显示在不同cluster中基因的平均表达。与点图相比,矩阵图可以用于校正的矩阵。默认情况下使用原始count。

>>> gs = sc.pl.matrixplot(pbmc, marker_genes_dict, groupby='bulk_labels')

接下来我们给图里加入系统树,并用standar_scale=var把矩阵进行scale到0-1:

>>> gs = sc.pl.matrixplot(pbmc, marker_genes_dict, groupby='bulk_labels', dendrogram=True, standard_scale='var')

如果我们用use_raw=False画图呢?使用pbmc里存储的已经经过sc.pp.scale处理后的矩阵来画图,并将坐标轴进行交换:

# to use the 'non-raw' data we select marker genes present in this data.
>>> marker_genes_2 = [x for x in marker_genes if x in pbmc.var_names]
>>> gs = sc.pl.matrixplot(pbmc, marker_genes_2, groupby='bulk_labels', dendrogram=True,
                      use_raw=False, vmin=-3, vmax=3, cmap='bwr',  swap_axes=True, figsize=(5,6))

热图

热图是将每一个细胞作为一行或者一列,groupby信息就是cluster的信息

>>> ax = sc.pl.heatmap(pbmc,marker_genes_dict, groupby='louvain')

你也可以将use_raw=False画图,代码如下,图就不放上来了:

>>> ax = sc.pl.heatmap(pbmc, marker_genes, groupby='louvain',
              var_group_positions=[(0,1), (11, 12)], use_raw=False, vmin=-3, vmax=3, cmap='bwr',
              var_group_labels=['B cells', 'dendritic'], var_group_rotation=0, dendrogram='dendrogram_louvain')

Tracksplots

Trackplot和热图是一样的,只不过基因的表达不是用标尺来表示,而是用高度来表示:

# Track plot 用来表示非log的count值会更好
>>> import numpy as np
>>> ad = pbmc.copy()
>>> ad.raw.X.data = np.exp(ad.raw.X.data)
>>> ax = sc.pl.tracksplot(ad,marker_genes, groupby='louvain')

过滤Marker基因

利用sc.tl.filter_rank_genes_groups工具,我们可以根据一些条件来选择性的可视化marker基因,比如说,在一个cluster里,选择那些变化倍数(fold change)至少是相对于其他cluster里的2倍以上,并且这个cluster里的marker基因变化2倍以上的细胞数至少要50%以上。

建立一个新的category(名为broad_type),把所有的T细胞放进去:

>>> t_cell = ['CD4+/CD25 T Reg', 'CD4+/CD45RA+/CD25- Naive T', 'CD4+/CD45RO+ Memory','CD8+ Cytotoxic T', 'CD8+/CD45RA+ Naive Cytotoxic']
pbmc.obs['broad_type'] = pd.Categorical(pbmc.obs.bulk_labels.apply(lambda x: x if x not in t_cell  else 'T-cell'))

在broad_type里寻找新的top基因:

>>> sc.tl.rank_genes_groups(pbmc, 'broad_type', method='wilcoxon', n_genes=20)
#这里官网写错了!!!他们把20个基因写成了200个!还是那句话:不要轻易相信任何人的代码,除非自己跑一遍!!!!
>>> sc.tl.filter_rank_genes_groups(pbmc)
>>> rcParams['figure.figsize'] = 4,4
>>> rcParams['axes.grid'] = True
>>> sc.pl.rank_genes_groups(pbmc, key='rank_genes_groups_filtered', ncols=3)

用过滤完marker基因画热图:

>>> sc.pl.rank_genes_groups_heatmap(pbmc, n_genes=200, key='rank_genes_groups_filtered',
                                swap_axes=True, use_raw=False, vmax=3, vmin=-3, cmap='bwr', dendrogram=True)

可以设置更为严格的marker基因过滤标准:

>>> sc.tl.filter_rank_genes_groups(pbmc,
                               min_in_group_fraction=0.5,
                               max_out_group_fraction=0.3,
                               min_fold_change=1.5)

然后比较一下过滤前和过滤后的点图:

#过滤前
>>> sc.pl.rank_genes_groups_dotplot(pbmc, n_genes=6)
过滤前
#过滤后
>>> sc.pl.rank_genes_groups_dotplot(pbmc, n_genes=6, key='rank_genes_groups_filtered')
过滤后

过滤后的看看矩阵图和小提琴图:

>>> sc.pl.rank_genes_groups_matrixplot(pbmc, n_genes=6, key='rank_genes_groups_filtered', standard_scale='var', cmap='Blues')
# Track plot data and violin is better visualized using the non-log counts
>>> ad = pbmc.copy()
>>> ad.raw.X.data = np.exp(ad.raw.X.data)
>>> sc.pl.rank_genes_groups_stacked_violin(ad, n_genes=6, key='rank_genes_groups_filtered', standard_scale='var')
>>> sc.pl.rank_genes_groups_tracksplot(ad, n_genes=6, key='rank_genes_groups_filtered')

用panels可视化高变基因

其实这个方法在这一系列笔记的第一篇里就提到了。不知道为什么这里又讲了一遍。我认为区别在于上面的图,我们都是根据给定的基因列表(marker gene)来做的,下面的图是根据每一个cluster里的高变基因做的。也就是说每一个cluster里都有自己的基因列表。

>>> import warnings
>>> warnings.simplefilter(action='ignore', category=FutureWarning)
>>> sc.tl.rank_genes_groups(pbmc, groupby='bulk_labels', method='logreg')
ranking genes
    finished (0:00:00)
#visualize marker genes using panels
>>> rcParams['figure.figsize'] = 4,4
>>> rcParams['axes.grid'] = True
>>> sc.pl.rank_genes_groups(pbmc)

把上面的图转换成点图,每个cluster里显示4个高变基因:

>>> sc.pl.rank_genes_groups_dotplot(pbmc, n_genes=4)

上面是显示了全部的cluster,现在可以让它只显示其中的两个,每个cluster显示15个基因:

>>> axs = sc.pl.rank_genes_groups_dotplot(pbmc, n_genes=15, groups=['Dendritic', 'CD19+ B'])

用矩阵点图可视化高变基因

>>> axs = sc.pl.rank_genes_groups_matrixplot(pbmc, n_genes=3, standard_scale='var', cmap='Blues')

换颜色:

>>> axs = sc.pl.rank_genes_groups_matrixplot(pbmc, n_genes=3, use_raw=False, vmin=-3, vmax=3, cmap='bwr')
image.png

用小提琴图展示高变基因

# instead of pbmc we use the 'ad' object (created earlier) in which the raw matrix is exp(pbmc.raw.matrix). This highlights better the differences between the markers.
>>> sc.pl.rank_genes_groups_stacked_violin(ad, n_genes=3)

把所有的“小提琴”设置成同样的颜色:

>>> sc.pl.rank_genes_groups_stacked_violin(ad, n_genes=3, row_palette='slateblue')

坐标轴交换:

>>> sc.pl.rank_genes_groups_stacked_violin(ad, n_genes=3, swap_axes=True, figsize=(6, 10), width=0.4)

用热图可视化高变基因

#展示前3个高变基因
>>> sc.pl.rank_genes_groups_heatmap(pbmc, n_genes=3, standard_scale='var')

同样的,你可以交换坐标轴,更改颜色,图不放了,放代码:

>>> #坐标轴交换
sc.pl.rank_genes_groups_heatmap(pbmc, n_genes=3, use_raw=False, swap_axes=True, vmin=-3, vmax=3, cmap='bwr')

下面可以显示每个cluster里的top10高变基因,去掉基因标签,将图旋转90度:

>>> sc.pl.rank_genes_groups_heatmap(pbmc, n_genes=10, use_raw=False, swap_axes=True, show_gene_labels=False,
                                vmin=-3, vmax=3, cmap='bwr')

你也许注意到了这个热图有点奇怪,感觉两边缺两条,实际不是缺,我感觉可能是其他原因。而且下面的cluster也没有和热图对其。但是并不妨碍结果的展示,因为如果你运行出来的图也有这样的问题,不用担心,你可以将图片保存为svg格式的图片,然后放到illustrator里进行编辑(illustrator是什么就不用说了),把下面的bar的长度调整到正确长度,两边的黑线往里面拉一拉就好了。

tracksplot可视化高变基因

>>> sc.pl.rank_genes_groups_tracksplot(ad, n_genes=3)

Plot相关性

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

推荐阅读更多精彩内容