首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >单细胞数据的细胞提取及分组UMAP图绘制流程参考(Python)

单细胞数据的细胞提取及分组UMAP图绘制流程参考(Python)

原创
作者头像
凑齐六个字吧
发布2025-06-29 19:33:22
发布2025-06-29 19:33:22
3330
举报
文章被收录于专栏:单细胞单细胞

在进行个性化探索的时候尝需要提取数据进行分组探索,以下就是一个简单流程。

1.导入
代码语言:javascript
复制
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import scanpy as sc
import numpy as np
import anndata as ad
import pooch
import os
代码语言:javascript
复制
# 确定位置
os.getcwd()
2.读取位置
代码语言:javascript
复制
# 读取数据
adata = sc.read_h5ad('./scRNA_V5.h5ad')
代码语言:javascript
复制
adata.obs
代码语言:javascript
复制
# 展示一下该数据集

# PCA
sc.tl.pca(adata)
# Harmony 整合
sce.pp.harmony_integrate(adata, 'orig.ident')  # 或 'sample'
# 构建邻接图
sc.pp.neighbors(adata, use_rep='X_pca_harmony')
# 然后再运行 UMAP
sc.tl.umap(adata)
代码语言:javascript
复制
sc.pl.umap(
    adata,                          # AnnData 对象
    color="celltype",              # 按 celltype 分组上色
    size=0.8,                      # 点大小,类似 pt.size
    legend_loc='right margin',          # 在图上显示标签,等价于 label = TRUE
    ncols=2,                       # 控制子图排列列数
    title=None,                    # 可选:不显示默认标题
    show =False
)
代码语言:javascript
复制
adata.obs["celltype"].unique()
3.模拟肿瘤和非肿瘤数据后进行比较
代码语言:javascript
复制
Tgroup = ["sample1", "sample3", "sample5"]
# np.where有点像ifelse
adata.obs['type'] = np.where(adata.obs['orig.ident'].isin(Tgroup), 'Tumor', 'Normal')
4.提取Tumor 和 Normal相同细胞数
代码语言:javascript
复制
adata.obs["type"].value_counts()

# type
# Tumor     2048
# Normal    1983
# Name: count, dtype: int64
代码语言:javascript
复制
# 获取 Tumor 和 Control 的索引
tumor_indices = adata.obs.index[adata.obs["type"] == "Tumor"]
control_indices = adata.obs.index[adata.obs["type"] == "Normal"]

# 随机选择目标数量个细胞
np.random.seed(42)  # 设置随机种子,以便结果可重复
selected_tumor_indices = np.random.choice(tumor_indices, size=1000, replace=False)
selected_control_indices = np.random.choice(control_indices, size=1000, replace=False)
#从 Tumor 和 Normal 各自中随机选取 1000 个细胞。
#replace=False 表示不放回抽样。

# 生成Tumor/Normal的子集
tumor_subset_adata = adata[selected_tumor_indices].copy()
control_subset_adata = adata[selected_control_indices].copy()

# 合并 Tumor 和 Control 子集
combined_adata = tumor_subset_adata.concatenate(control_subset_adata)

# 3. 进行 Harmony 处理
sce.pp.harmony_integrate(combined_adata, 'orig.ident')

# 进行邻接图构建和 UMAP 降维
sc.pp.neighbors(combined_adata, n_neighbors=20, n_pcs=15, use_rep='X_pca_harmony')
sc.tl.umap(combined_adata)
5.结果绘制
代码语言:javascript
复制
# 4. 绘制 UMAP 图,两张图分别显示 Tumor 和 Control
fig, axes = plt.subplots(1, 2, figsize=(12, 6))

# 选择合并后的数据并绘制 Tumor 的 UMAP
tumor_mask = combined_adata.obs['type'] == 'Tumor'
sc.pl.umap(combined_adata[tumor_mask], ax=axes[0], show=False, title='Tumor UMAP', color='celltype', legend_loc=None)

# 选择合并后的数据并绘制 Control 的 UMAP
control_mask = combined_adata.obs['type'] == 'Normal'
sc.pl.umap(combined_adata[control_mask], ax=axes[1], show=False, title='Normal UMAP', color='celltype')

# 遍历所有文本对象,调节字体大小
for ax in fig.axes:
    # 调整 x 轴标签
    ax.tick_params(axis='x', labelsize=12, rotation=45)  # X轴字体大小+旋转
    # 调整 y 轴标签
    ax.tick_params(axis='y', labelsize=12)               # Y轴字体大小
    # 如果需要,可以加轴标题字体大小
    ax.xaxis.label.set_size(14)
    ax.yaxis.label.set_size(14)
    # 可以设置更具体的标题字体
    ax.title.set_fontsize(16)

plt.savefig("umapPlot_sub.pdf",bbox_inches='tight',dpi=300)
plt.show()

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.导入
  • 2.读取位置
  • 3.模拟肿瘤和非肿瘤数据后进行比较
  • 4.提取Tumor 和 Normal相同细胞数
  • 5.结果绘制
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档