Scanpy(二)可视化函数
目錄
- embedding的散點圖
- 可視化基因表達量與其他變量
- 用已知marker基因識別clusters
- dotplot
- violin plot
- stacked-violin plot
- matrixplot
- 將圖放到子圖中
- Heatmaps
- Tracksplot
- 標記基因的可視化
- 用dotplot可視化marker基因
- 用matrixplot可視化marker基因
- 用tracksplot可視化marker基因
- 使用violin plot比較標記基因
- 樹狀圖選項Dendrogram
- 可視化相關性
本篇內容為scanpy的可視化方法,可以分為三部分:
- embedding的散點圖;
- 用已知marker genes的聚類識別(Identification of clusters);
- 可視化基因的差異表達;
我們使用10x的PBMC數據集(包含68k個細胞)。Scanpy在其發行版中包含了這個數據集的縮減版,該數據集只包含700個細胞和765個高變基因。此數據集已經過預處理和UMAP計算。
在本篇內容里,我們使用到以下標記基因(來自于已知的文獻結論,比如B-cell的標記基因為CD79A, MS4A1):
- B-cell: CD79A, MS4A1
- Plasma: IGJ (JCHAIN)
- T-cell: CD3D
- NK: GNLY, NKG7
- Myeloid: CST3, LYZ
- Monocytes: FCGR3A
- Dendritic: FCER1A
embedding的散點圖
基于scanpy,tSNE、UMAP和其他幾個embedding的散點圖可以從文檔輕松找到。比如可以看這里的選項列表:sc.pl.tsne,sc.pl.umap。
我們先進行初始化設置:
import scanpy as sc import pandas as pd from matplotlib.pyplot import rc_context sc.set_figure_params(dpi=100, color_map = 'viridis_r') sc.settings.verbosity = 1 sc.logging.print_header() """ scanpy==1.6.0 anndata==0.8.0 numpy==1.21.6 scipy==1.8.0 pandas==1.4.2 scikit-learn==1.0.2 statsmodels==0.11.0 python-igraph==0.8.0 """加載pbmc縮減版數據集:
pbmc = sc.datasets.pbmc68k_reduced() # 檢查pbmc內容 pbmc """ AnnData object with n_obs × n_vars = 700 × 765obs: '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'obsp: 'distances', 'connectivities' """這里補充關于adata的obsm,varm和obsp的內容:
- obsm:對于觀測的多維注釋(即對于矩陣的行的多維注釋),它是可變的ndarray,長度為n_obs,維度為2至多維。這里的m指的就是multi-dim多個維度的,obs_m對應于obs,但obs的每個成員都是一維的觀測注釋,obs_m的每個成員(X_pac和X_umap)都是多維的觀測注釋。
- varm:用于描述特征的,與obsm相對應。
- obsp(obs pair):針對觀測的配對的注釋(存儲為稀疏矩陣),稀疏矩陣兩維都是n_obs,obsp通常用于描述觀測與觀測之間的距離和連通性。比如:
可視化基因表達量與其他變量
對于散點圖,參數color是可視化的一個值,可以是Adata的任何基因或者obs里的任何對象,注意obs是存儲注釋信息的dataframe。
可視化基因CD79A在所有細胞中的表達量分布,由于pbmc這個adata已經有X_umap,我們可以用sc.pl.umap實現UMAP下的基因表達分布:
# rc_context用于指定figure大小 with rc_context({'figure.figsize': (4, 4)}):sc.pl.umap(pbmc, color='CD79A')可以給多個值。在下面的示例中,我們將繪制6個基因:“CD79A”、“MS4A1”、“IGJ”、“CD3D”、“FCER1A”和“FCGR3A”,以了解這些marker基因的表達。
此外,我們還將繪制另外兩個值:
- 一個是每個細胞的UMI計數數n_counts(UMI檢測到的基因越多,數據越復雜);
- 一個是一個分類值categorical value bulk_labels(來自10x的細胞原始標簽)。
使用參數ncols控制每行的可視化案例數。可以使用vmax調整繪制顏色的最大值(同樣vmin可以用于最小值)。在本例中,我們使用vmax='p99',這意味著使用99%作為最大值。如果要分別為多個可視化案例設置vmax,則vamx可以是一個數字或一組數字。
此外,我們還使用frameon=False移除可視化圖的邊框,并用s=50設置點大小。
with rc_context({'figure.figsize': (3, 3)}):sc.pl.umap(pbmc, color=['CD79A', 'MS4A1', 'IGJ', 'CD3D', 'FCER1A', 'FCGR3A', 'n_counts', 'bulk_labels'], s=50, frameon=False, ncols=4, vmax='p99')
在圖中,我們可以看到標記基因的細胞群與原始細胞標簽的大概一致性。
散點圖函數還有很多選項,可以微調圖像。例如,我們可以如下所示查看clustering:
# 用leiden聚類計算, 結果存儲到'clusters'中 sc.tl.leiden(pbmc, key_added='clusters', resolution=0.5) pbmc """ AnnData object with n_obs × n_vars = 700 × 765obs: 'bulk_labels', 'n_genes', 'percent_mito', 'n_counts', 'S_score', 'G2M_score', 'phase', 'louvain', 'clusters'var: 'n_counts', 'means', 'dispersions', 'dispersions_norm', 'highly_variable'uns: 'bulk_labels_colors', 'louvain', 'louvain_colors', 'neighbors', 'pca', 'rank_genes_groups', 'leiden'obsm: 'X_pca', 'X_umap'varm: 'PCs'obsp: 'distances', 'connectivities' """注意到,obs中多了一個注釋"clusters",下一步用"clusters"作為可視化的繪制值:
with rc_context({'figure.figsize': (5, 5)}):sc.pl.umap(pbmc, color='clusters', add_outline=True, legend_loc='on data',legend_fontsize=12, legend_fontoutline=2,frameon=False,title='clustering of cells', palette='Set1')用已知marker基因識別clusters
通常,clusters需要使用已知的標記基因進行標記。使用散點圖,我們可以看到一個基因在所有細胞中的表達,并可能將其與一個簇相關聯。在這里,我們將展示使用點圖dotplots、小提琴圖violin plots、熱圖heatmaps和我們稱之為“tracksplot”的圖將標記基因與clusters關聯。所有這些可視化都展示了相同的信息,最佳結果的選擇由研究人員決定。
首先,我們為標記基因建立了一個字典,因為這將允許scanpy自動標記基因組:
marker_genes_dict = {'B-cell': ['CD79A', 'MS4A1'],'Dendritic': ['FCER1A', 'CST3'],'Monocytes': ['FCGR3A'],'NK': ['GNLY', 'NKG7'],'Other': ['IGLL1'],'Plasma': ['IGJ'],'T-cell': ['CD3D'], }dotplot
檢查每個簇中這些基因表達的快速方法是使用dotplot。這種圖概括了兩種類型的信息:
- 顏色表示一個基因,在每個類別(每個簇)內的平均表達;
- 點大小表示表達基因的細胞類別中的細胞比例。
此外,將樹狀圖添加到圖中也很有用(點圖右側的樹狀結構),可以將類似的簇聚集在一起。scanpy使用簇之間的PCA分量的相關性實現層次聚類。
sc.pl.dotplot(pbmc, marker_genes_dict, 'clusters', dendrogram=True)
使用該圖,我們可以看到簇4對應于B-cell,簇2對應于T-cell等。該信息可用于手動注釋細胞,如下所示:
我們用cell type去可視化點圖:
sc.pl.dotplot(pbmc, marker_genes_dict, 'cell type', dendrogram=True)
將標簽可視化到散點圖中,用cell type作為繪制的參數:
violin plot
探索marker基因的另一種方式是violin plot。我們可以看到CD79A在簇4和簇6中的表達,以及MS4A1在簇4中的表達。(注意一個事實:CD79A和MS4A1是B-cell的標記基因)與dotplot相比,violin plot為我們提供了基因表達值在細胞中的分布概念。
使用clusters作為group的索引:
with rc_context({'figure.figsize': (4.5, 3)}):sc.pl.violin(pbmc, ['CD79A', 'MS4A1'], groupby='clusters' )小提琴圖也可用于繪制存儲在obs中的任何值。例如,這里使用小提琴圖來比較不同簇之間的基因數量n_genes和線粒體基因百分比percent_mito。
with rc_context({'figure.figsize': (4.5, 3)}):# stripplot=False用于刪除internal dots, inner='box'用于在小提琴內部加方框圖sc.pl.violin(pbmc, ['n_genes', 'percent_mito'], groupby='clusters', stripplot=False, inner='box')stacked-violin plot
為了同時查看所有marker基因的小提琴圖,我們使用sc.pl.stacked_violin,如前所述,添加了一個樹狀圖(dendrogram)來對相似的簇進行分組。
ax = sc.pl.stacked_violin(pbmc, marker_genes_dict, groupby='clusters', swap_axes=False, dendrogram=True)matrixplot
可視化基因表達的一種簡單方法是使用matrixplot,這是按類別(簇)分組的每個基因的平均表達值的熱圖。這種圖基本上顯示與點圖中的顏色相同的信息。
在這里,將基因的表達從0縮放到1,這是最大的平均表達,0是最小的。
sc.pl.matrixplot(pbmc, marker_genes_dict, 'clusters', dendrogram=True, cmap='Blues', standard_scale='var', colorbar_title='column scaled\nexpression')
其他有用的選項是用sc.pp.scale對表達標準化,這里,我們將scale后的信息保存在adata的隱藏dataframelayers中:
再用matrixplot可視化,并使用其他cmap:
sc.pl.matrixplot(pbmc, marker_genes_dict, 'clusters', dendrogram=True,colorbar_title='mean z-score', layer='scaled', cmap='RdBu_r')將圖放到子圖中
可以使用plt.subplots的返回對象ax將圖變成子圖:
import matplotlib.pyplot as pltfig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(20,4), gridspec_kw={'wspace':0.9})ax1_dict = sc.pl.dotplot(pbmc, marker_genes_dict, groupby='bulk_labels', ax=ax1, show=False) ax2_dict = sc.pl.stacked_violin(pbmc, marker_genes_dict, groupby='bulk_labels', ax=ax2, show=False) ax3_dict = sc.pl.matrixplot(pbmc, marker_genes_dict, groupby='bulk_labels', ax=ax3, show=False, cmap='viridis')Heatmaps
熱圖不像前面的圖會折疊了每個細胞,熱圖中,每個細胞都顯示在每一行上。
ax = sc.pl.heatmap(pbmc, marker_genes_dict, groupby='clusters', cmap='viridis', dendrogram=True)
熱圖也可以繪制在scale過的數據上。在下圖中,與前面的matrixplot相似(注意參數layer='scaled)。
Tracksplot
Tracksplot顯示的信息與熱圖相同,但基因表達由高度表示,而不是色階。
ax = sc.pl.tracksplot(pbmc, marker_genes_dict, groupby='clusters', dendrogram=True)標記基因的可視化
我們可以識別在簇中差異表達的基因,而不是像前面那樣通過已知的標記基因來表示簇。
我們用sc.tl.rank_genes_groups識別差異表達的基因,此函數將獲取每組細胞,并將每組中每個基因的分布與不在該組中的所有其他細胞中的分布進行比較。
sc.tl.rank_genes_groups(pbmc, groupby='clusters', method='wilcoxon')在這里,我們將使用10x給出的原始細胞標簽來驗證這些細胞類型的標記基因。
用dotplot可視化marker基因
dotplot可以得到大致的差異基因表達總覽。為了讓可視化結果更緊湊,我們僅對每類細胞的差異表達得分前4的基因可視化(n_genes=4)。
sc.pl.rank_genes_groups_dotplot(pbmc, n_genes=4)
為了獲得更好的表示,我們可以可視化取log(values_to_plot='logfoldchanges'),而不是原始的基因表達圖。此外,我們希望關注差異得分取log后>=3的基因(min_logfoldchange=3)。
由于log是一個發散比例,我們還要調整可視化的最小值和最大值。注意,在下面的圖中,很難區分T-cell。
sc.pl.rank_genes_groups_dotplot(pbmc, n_genes=4, values_to_plot='logfoldchanges', min_logfoldchange=3, vmax=7, vmin=-7, cmap='bwr')
下一步,我們集中關注不好分辨的兩個組(簇1和5),在這里,我們增加參數groups=['1', '5'],并且設置更大范圍的基因,再取對數。
用matrixplot可視化marker基因
對于下圖,我們使用之前計算的scale數據(存儲在layers下)可視化。
sc.pl.rank_genes_groups_matrixplot(pbmc, n_genes=3, use_raw=False, cmap='bwr', layer='scaled')用tracksplot可視化marker基因
每個簇都選出差異得分前3的基因,下圖右側即為每個簇的前3高差異表達基因。
sc.pl.rank_genes_groups_tracksplot(pbmc, n_genes=3)使用violin plot比較標記基因
在scanpy中,使用split violin plots同時對所有簇比較標記基因非常容易。我們對每個比較都展示前20個高差異得分的基因:
with rc_context({'figure.figsize': (9, 1.5)}):sc.pl.rank_genes_groups_violin(pbmc, n_genes=20, jitter=False)每個簇都與其他簇比較,會可視化得到9個子圖(0-rest直到8-rest),比如0-rest:
我們可以對比上面兩張圖(tracksplot和split violin 0-rest),發現前3個差異基因正好是FTL,AIF1,LST1。
樹狀圖選項Dendrogram
大多數可視化可以使用樹狀圖來排列類別。當然,樹狀圖也可以單獨繪制,如下所示:
# 計算簇間的層次結構, 此處使用obs的bulk_labels做標簽 sc.tl.dendrogram(pbmc, 'bulk_labels') ax = sc.pl.dendrogram(pbmc, 'bulk_labels')可視化相關性
相關性的可視化可以與樹狀圖一起,相關性可視化通常是繪制類別的相關性。
ax = sc.pl.correlation_matrix(pbmc, 'bulk_labels', figsize=(5,3.5))總結
以上是生活随笔為你收集整理的Scanpy(二)可视化函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 联想E431 1K6安装Windows系
- 下一篇: OGC标准介绍