这是python版,改天再发R语言版的。
import pandas as pd
import scanpy as sc
import matplotlib.pyplot as plt
sc.set_figure_params(dpi=100, color_map = 'viridis_r', transparent=False, frameon=False)
adata.h5ad中存储的是已经初次注释好的对象adata。其中self_annotation列是细胞类型注释。
adata_Fibro.obs.csv是成纤维细胞二次分群+注释得到的obs信息。在本公众号聊天框(注意不是评论区)回复:anno1035可以获取本文的示例数据。
adata = sc.read('adata.h5ad')
adata
AnnData object with n_obs × n_vars = 11727 × 21189
obs: 'batch', 'group', 'n_genes', 'n_genes_by_counts', 'total_counts', 'total_counts_mt', 'pct_counts_mt', 'total_counts_ribo', 'pct_counts_ribo', 'total_counts_hb', 'pct_counts_hb', 'leiden', 'predicted_labels', 'over_clustering', 'majority_voting', 'conf_score', 'self_annotation'
var: 'n_cells', 'mt', 'ribo', 'hb', 'n_cells_by_counts', 'mean_counts', 'pct_dropout_by_counts', 'total_counts', 'highly_variable', 'means', 'dispersions', 'dispersions_norm', 'mean', 'std'
uns: 'batch_colors', 'group_colors', 'hvg', 'leiden', 'leiden_colors', 'log1p', 'majority_voting_colors', 'neighbors', 'over_clustering', 'pca', 'self_annotation_colors', 'umap'
obsm: 'X_pca', 'X_pca_harmony', 'X_umap'
varm: 'PCs'
obsp: 'connectivities', 'distances'
sc.pl.umap(adata,color='self_annotation',legend_loc='on data',legend_fontsize=5)
subcell_annotator = pd.read_csv('adata_Fibro.obs.csv', index_col=0)[['Minor_cluster']]
print(subcell_annotator)
Minor_cluster
CTCCTCCTCGACCACG-1 fibro 3
CATGGATCAAGTGATA-1 fibro 3
AGTCTCCGTTGGTGTT-1 fibro 3
CTCCGATTCGTAGCTA-1 fibro 3
CTCCTCCTCGACCACG-1-1 fibro 3
... ...
ACCCAAAGTATCCTTT-1-1 fibro 2
ATGCATGTCAGATTGC-1 fibro 3
TACAGGTTCGGCTTGG-1 fibro 3
GACTTCCCAATGTTGC-1 fibro 1
TCATCATAGGCCTGCT-1-1 fibro 2
[2366 rows x 1 columns]
print(subcell_annotator.Minor_cluster.unique())
['fibro 3' 'fibro 2' 'fibro 1']
将二次分群的结果整合到原来的adata的obs中去,这里使用了一个神奇的方法combine_first,一个身怀绝技而其貌不扬的扫地僧: 它的作用是连接。
subcell_annotator的行名是(成纤维)细胞名称,adata.obs的行名是(全部)细胞名称,前者是后者的子集。
对于subcell_annotator中的细胞(成纤维细胞),combine_first的结果是subcell_annotator['Minor_cluster'],对于subcell_annotator中的没有的细胞(非成纤维细胞),combine_first的结果是adata.obs['self_annotation']。
也就是说有二次分群的就输出二次分群的注释结果,没有二次分群的就输出原来的注释结果!非常便捷的实现了二次分群的结果整合到原有的对象中,也就可以画在大的umap图里面!
按照这个思路,如果细胞数量太多,多种细胞的二次分群结果也都可以重新整合回大的umap图里。虽然这个技巧看着不起眼,但这也就是那些百万级别的单细胞数据那么大那么细致的umap图是怎么画出来的啦!是真正的大招啊!看你识货不。
adata.obs['Minor_cluster'] = subcell_annotator['Minor_cluster'].combine_first(adata.obs['self_annotation'])
print(adata.obs['self_annotation'].unique().tolist())
['T', 'B', 'Fibroblast', 'Smooth_muscle', 'Macrophage', 'Neutrophil', 'Plasma', 'Endothelial', 'NK', 'Mast']
print(adata.obs['Minor_cluster'].unique().tolist())
['T', 'B', 'fibro 3', 'Smooth_muscle', 'Macrophage', 'Neutrophil', 'Plasma', 'Endothelial', 'NK', 'Mast', 'fibro 2', 'fibro 1']
adata.obs['self_annotation'].value_counts()
self_annotation
T 4213
Fibroblast 2366
B 1530
Neutrophil 1084
Macrophage 809
Endothelial 651
Plasma 353
NK 335
Smooth_muscle 289
Mast 97
Name: count, dtype: int64
adata.obs['Minor_cluster'].value_counts()
Minor_cluster
T 4213
B 1530
fibro 2 1099
Neutrophil 1084
Macrophage 809
fibro 3 713
Endothelial 651
fibro 1 554
Plasma 353
NK 335
Smooth_muscle 289
Mast 97
Name: count, dtype: int64
注意看,前者是Fibroblasts,后者是细分之后的fibro 1,2,3。
sc.pl.umap(adata,color='Minor_cluster',legend_loc='on data',legend_fontsize=5)
图上也是,可以看出来成纤维细胞细分了,其他的还是原样。