前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >百万级别的单细胞数据是怎样完成注释的(python)

百万级别的单细胞数据是怎样完成注释的(python)

作者头像
用户11414625
发布2025-03-06 21:57:02
发布2025-03-06 21:57:02
4900
代码可运行
举报
文章被收录于专栏:生信星球520生信星球520
运行总次数:0
代码可运行

这是python版,改天再发R语言版的。

代码语言:javascript
代码运行次数:0
复制
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)

1.输入数据

adata.h5ad中存储的是已经初次注释好的对象adata。其中self_annotation列是细胞类型注释。

adata_Fibro.obs.csv是成纤维细胞二次分群+注释得到的obs信息。在本公众号聊天框(注意不是评论区)回复:anno1035可以获取本文的示例数据。

代码语言:javascript
代码运行次数:0
复制
adata = sc.read('adata.h5ad')
adata
代码语言:javascript
代码运行次数:0
复制
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'
代码语言:javascript
代码运行次数:0
复制
sc.pl.umap(adata,color='self_annotation',legend_loc='on data',legend_fontsize=5)

代码语言:javascript
代码运行次数:0
复制
subcell_annotator =  pd.read_csv('adata_Fibro.obs.csv', index_col=0)[['Minor_cluster']]
print(subcell_annotator)
代码语言:javascript
代码运行次数:0
复制
                     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]
代码语言:javascript
代码运行次数:0
复制
print(subcell_annotator.Minor_cluster.unique())
代码语言:javascript
代码运行次数:0
复制
['fibro 3' 'fibro 2' 'fibro 1']

2.整合

将二次分群的结果整合到原来的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图是怎么画出来的啦!是真正的大招啊!看你识货不。

代码语言:javascript
代码运行次数:0
复制
adata.obs['Minor_cluster'] = subcell_annotator['Minor_cluster'].combine_first(adata.obs['self_annotation'])
代码语言:javascript
代码运行次数:0
复制
print(adata.obs['self_annotation'].unique().tolist())
代码语言:javascript
代码运行次数:0
复制
['T', 'B', 'Fibroblast', 'Smooth_muscle', 'Macrophage', 'Neutrophil', 'Plasma', 'Endothelial', 'NK', 'Mast']
代码语言:javascript
代码运行次数:0
复制
print(adata.obs['Minor_cluster'].unique().tolist())
代码语言:javascript
代码运行次数:0
复制
['T', 'B', 'fibro 3', 'Smooth_muscle', 'Macrophage', 'Neutrophil', 'Plasma', 'Endothelial', 'NK', 'Mast', 'fibro 2', 'fibro 1']
代码语言:javascript
代码运行次数:0
复制
adata.obs['self_annotation'].value_counts()
代码语言:javascript
代码运行次数:0
复制
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
代码语言:javascript
代码运行次数:0
复制
adata.obs['Minor_cluster'].value_counts()
代码语言:javascript
代码运行次数:0
复制
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。

代码语言:javascript
代码运行次数:0
复制
sc.pl.umap(adata,color='Minor_cluster',legend_loc='on data',legend_fontsize=5)

图上也是,可以看出来成纤维细胞细分了,其他的还是原样。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-03-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信星球 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.输入数据
  • 2.整合
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档