生信技能树从今年开始会大力推行 python 版本的生信生态,推广很多关于 python 版本的生信分析教程。敬请关注~新专辑《python生信笔记2025》。
上一期我们学习了使用python读取单细胞和空转数据(10X visum低分辨率):
今天来学习 空间转录组 Visum HD的数据读取以及简单分析~
此次教程分析使用数据:10x官方的结直肠癌 Visum HD数据集。
下载链接:https://www.10xgenomics.com/products/visium-hd-spatial-gene-expression/dataset-human-crc
这个数据集总共有5个样本,3个癌症样本,2个正常样本,你可以都下载下来或者只下载其中一个,本教程用了其中的:Human_Colon_Cancer_P2。
Note:数据其实不好下载,很容易中断,然后有几个数据有特别大,可以考虑晚上使用axel
多线程下载。成功路上的绊脚石总是这些费力不讨好的事情!下载成功了事情就成功了一小部分,后面还有个大劫等着你!!!
# Output Files
wget https://cf.10xgenomics.com/samples/spatial-exp/3.0.0/Visium_HD_Human_Colon_Cancer_P1/Visium_HD_Human_Colon_Cancer_P1_binned_outputs.tar.gz
wget https://cf.10xgenomics.com/samples/spatial-exp/3.0.0/Visium_HD_Human_Colon_Cancer_P1/Visium_HD_Human_Colon_Cancer_P1_spatial.tar.gz
wget https://cf.10xgenomics.com/samples/spatial-exp/3.0.0/Visium_HD_Human_Colon_Cancer_P1/Visium_HD_Human_Colon_Cancer_P1_molecule_info.h5
wget https://cf.10xgenomics.com/samples/spatial-exp/3.0.0/Visium_HD_Human_Colon_Cancer_P1/Visium_HD_Human_Colon_Cancer_P1_cloupe_008um.cloupe
wget https://cf.10xgenomics.com/samples/spatial-exp/3.0.0/Visium_HD_Human_Colon_Cancer_P1/Visium_HD_Human_Colon_Cancer_P1_feature_slice.h5
wget https://cf.10xgenomics.com/samples/spatial-exp/3.0.0/Visium_HD_Human_Colon_Cancer_P1/Visium_HD_Human_Colon_Cancer_P1_metrics_summary.csv
整理成如下格式:
Human_Colon_Cancer_P2
├── binned_outputs
│ ├── square_002um
│ ├── square_008um
│ └── square_016um
├── P2_feature_slice.h5
├── spatial
│ ├── aligned_fiducials.jpg
│ ├── aligned_tissue_image.jpg
│ ├── cytassist_image.tiff
│ ├── detected_tissue_image.jpg
│ ├── tissue_hires_image.png
│ └── tissue_lowres_image.png
└── web_summary.html
关于这些目录中的结果文件解读,详细版本可以看官网:https://www.10xgenomics.com/support/software/space-ranger/latest/analysis/outputs/spatial-outputs,教程稍后就来~
真的是太难了啊!第一篇稿子的时候:python版读取不同的单细胞数据格式(单样本与多样本),地下有个留言说python软件太难配置了,我还嘴硬说其实还行!现在就打脸!!!奋斗到半夜,我这里就不写心酸血泪史了:
你如果配置有问题,可以考虑找我要一个conda的yaml文件,微信是:Biotree123
参考:https://scanpy-tutorials.readthedocs.io/en/latest/spatial/basic-analysis.html
还有一个可以分析10X Visum HD数据的教程:https://stlearn.readthedocs.io/en/latest/tutorials/stSME_clustering.html
这个里面 你缺啥就安装啥,使用conda 创建一个python=3.10的小环境
import os
import numpy as np
import pandas as pd
import seaborn as sns
import scanpy as sc
import matplotlib.pyplot as plt
from matplotlib.pyplot import rc_context
跟 Visum v1/v2不一样的是,Visium HD 使用的Space Ranger v3.0的输出目录结构如下:
有三个分辨率的分析结果:square_002um、square_008um、square_016um,这里选择 square_008um 进行读取和分析。
Human_Colon_Cancer_P2
├── binned_outputs
│ ├── square_002um
│ │ ├── filtered_feature_bc_matrix
│ │ ├── filtered_feature_bc_matrix.h5
│ │ ├── raw_feature_bc_matrix
│ │ ├── raw_feature_bc_matrix.h5
│ │ ├── raw_probe_bc_matrix.h5
│ │ └── spatial
│ ├── square_008um
│ │ ├── analysis
│ │ ├── cloupe.cloupe
│ │ ├── filtered_feature_bc_matrix
│ │ ├── filtered_feature_bc_matrix.h5
│ │ ├── raw_feature_bc_matrix
│ │ ├── raw_feature_bc_matrix.h5
│ │ └── spatial
│ └── square_016um
│ ├── analysis
│ ├── filtered_feature_bc_matrix
│ ├── filtered_feature_bc_matrix.h5
│ ├── raw_feature_bc_matrix
│ ├── raw_feature_bc_matrix.h5
│ └── spatial
├── P2_feature_slice.h5
├── spatial
│ ├── aligned_fiducials.jpg
│ ├── aligned_tissue_image.jpg
│ ├── cytassist_image.tiff
│ ├── detected_tissue_image.jpg
│ ├── tissue_hires_image.png
│ └── tissue_lowres_image.png
└── web_summary.html
此外,square_008um 的spatial文件夹下的位置信息文件是tissue_positions.parquet,需要转换一下变成原来的低分辨率一样的配置文件: tissue_positions_list.csv,才可以使用read_visium
函数读取数据:
# 读取 tissue_positions.parquet
position_df = pd.read_parquet('../Visium_HD/0.Data_Download/Human_Colon_Cancer_P2/binned_outputs/square_008um/spatial/tissue_positions.parquet')
position_df.head
# 保存
position_df.to_csv('../Visium_HD/0.Data_Download/Human_Colon_Cancer_P2/binned_outputs/square_008um/spatial/tissue_positions_list.csv', index=False, header=None)
# 8um bin数据读取
adata = sc.read_visium("../Visium_HD/0.Data_Download/Human_Colon_Cancer_P2/binned_outputs/square_008um/", library_id='P2')
adata.obs['sample'] = 'P2'
adata
这一步骤在空转,也可以选择不进行数据过滤:
# QC
adata.var['mt'] = adata.var_names.str.upper().str.startswith('MT-')
adata.var['ribo'] = adata.var_names.str.upper().str.startswith(("RPS","RPL"))
sc.pp.calculate_qc_metrics(adata, qc_vars=['mt', 'ribo'], percent_top=None, log1p=False, inplace=True)
# 绘制小提琴图
sc.pl.violin(
adata,
['n_genes_by_counts', 'total_counts', 'pct_counts_mt'],
groupby='sample',
jitter=False,
multi_panel=True,
show=False
)
过滤前的数据分布:
过滤:UMI counts数小于50个的bin细胞、线粒体基因占比大于30%的bin细胞进行去除:
## 低质量bin细胞过滤
sc.pp.filter_cells(adata, min_counts=50)
adata = adata[(adata.obs['pct_counts_mt'] < 30)]
adata
# 过滤后的小提琴图
sc.pl.violin(
adata,
['n_genes_by_counts', 'total_counts', 'pct_counts_mt'],
groupby='sample',
jitter=False,
multi_panel=True,
show=False
)
在切片上展示这些指标,查看其空间分布特征:
# 细胞过滤后,空间上展示展示基因数、counts, 线粒体比例数等
with rc_context({'figure.figsize': (8, 8)}):
sc.pl.spatial(
adata,
color=['n_genes_by_counts', 'total_counts', 'pct_counts_mt'],
library_id='P2',
alpha_img=0.6
)
简单过滤后,使用 scanpy 进行降维聚类分析,步骤处理与单细胞一致:
## data normalization and log10 transform
adata.layers["counts"] = adata.X.copy()
adata.raw = adata
adata
sc.pp.normalize_total(adata)
sc.pp.log1p(adata)
## 选择高变基因
sc.pp.highly_variable_genes(adata, min_mean=0.0125, max_mean=3, min_disp=0.5, n_top_genes=2000)
# sc.pp.regress_out(adata, ['total_counts', 'pct_counts_mt'])
# 数据归一化
sc.pp.scale(adata, max_value=10)
# 可视化高变基因
sc.pl.highly_variable_genes(adata, show=False)
PCA分析:
## PCA
sc.tl.pca(adata, svd_solver='arpack')
# 可视化聚类结果
sc.pl.pca(adata, color='sample', show=False)
# 可视化PC主成分贡献
sc.pl.pca_variance_ratio(adata, log=True, show=False)
然后简单的预处理,并降维聚类:
# UMAP
sc.pp.neighbors(adata, n_neighbors=15, n_pcs=20)
sc.tl.umap(adata)
sc.tl.leiden(adata, resolution=0.6, key_added='res_0.6')
# 保存一下数据
adata.write("./P2.h5ad")
# 切片展示聚类结果:
sc.pl.umap(adata, color=["res_0.6"])
sc.pl.spatial(adata, img_key = "hires", color="res_0.6", size=1.2)
感觉真是视觉盛宴,分辨率比低精度的高很多!