空间单细胞对象结构(R和python)

R-seurat

1. Seurat对象的整体结构

Seurat对象主要包含以下几大组件:

2. 典型结构:10x Visium

SeuratObject
├── assays
│   └── Spatial(默认)
│       ├── counts:原始计数矩阵
│       ├── data:标准化表达矩阵(log normalized)
│       └── scale.data:经过缩放的表达数据(比如scale之后)
├── meta.data
│   └── 空间spot相关信息(细胞类型、样本条件等)
├── reductions
│   ├── pca:主成分分析结果
│   └── umap/tSNE:降维可视化结果
└── images
    └── slice1(空间图像信息)
        ├── coordinates:空间坐标数据(x, y位置)
        ├── image:组织的原始切片图像
        ├── scale factors:图像与空间坐标之间的尺度因子
        └── spot radius:空间spots的半径


3. 访问Seurat对象内容的示例代码

library(Seurat)

# 假设数据对象名为obj
# 查看Seurat对象结构
str(obj)

# 提取空间坐标
coords <- GetTissueCoordinates(obj)

# 提取表达矩阵
expr_matrix <- GetAssayData(obj, slot = "data", assay = "Spatial")

# 提取空间图片
image <- obj@images$slice1@image

Python环境(scanpy/Squidpy)

1.AnnData对象的整体结构

AnnData对象
├── X:主表达矩阵(通常为基因表达)
├── obs:观测单元元数据(细胞或spot的元信息)
├── var:基因层面的信息
├── uns:非结构化数据(通常存储如图像、空间坐标元数据)
├── obsm:观测单元的多维信息(如PCA、空间坐标)
├── layers:可选项,存储多个版本的表达数据(如raw counts、normalized数据)
└── obsp/varp:可选,存储pairwise关系数据(如空间邻域图)

2. 空间转录组的典型结构

以10x Visium数据为例:

AnnData object
├── X (spots × genes):表达矩阵
├── obs:spot级别的元数据(如细胞簇、样本组别)
├── var:基因的元信息
├── uns
│   └── spatial
│       └── sample1
│           ├── images:组织图片(高、低分辨率)
│           └── scalefactors:尺度信息(用于坐标与图片对应)
├── obsm
│   └── spatial:空间坐标 (spots × 2,x, y)
└── layers(可选)
    ├── counts:原始计数
    └── normalized:归一化后的表达数据

3. 访问示例代码

import scanpy as sc
import squidpy as sq

# 加载数据
adata = sq.datasets.visium_hne_adata()

# 查看结构
print(adata)

# 获取表达矩阵
expr_matrix = adata.X  # 或 adata.layers['counts']

# 获取空间坐标
coords = adata.obsm['spatial']

# 获取组织图片
image = adata.uns['spatial']['V1_Human_Lymph_Node']['images']['hires']


Seurat 对象和AnnData对象结构的差异总结

特征 Seurat(R) AnnData(Python)
数据存储 assays (counts/data/scale.data) X或layers
元数据 meta.data obs (spots) / var (genes)
空间坐标 images下的coordinates obsm['spatial']
空间图像 images下的image uns['spatial'][sample]['images']
尺度信息 images下的scale.factors uns['spatial'][sample]['scalefactors']
降维信息 reductions obsm

两者数据结构互相转化

library(SeuratDisk)

SaveH5Seurat(obj, filename = "data.h5Seurat")
Convert("data.h5Seurat", dest = "h5ad")

Matrix Market Exchange Format (MEX) 格式对应关系

一般数据结构是:

├── matrix.mtx
├── features.tsv(或features.tsv.gz)
├── barcodes.tsv(或barcodes.tsv.gz)
└── spatial/
    ├── tissue_positions_list.csv(或tissue_positions.csv)
    ├── tissue_lowres_image.png
    ├── tissue_hires_image.png
    └── scalefactors_json.json

R中

文件 对象中位置
matrix.mtx、features.tsv、barcodes.tsv obj@assays$Spatial@counts 原始计数矩阵数据
obj@assays$Spatial@data 归一化数据
tissue_positions_list.csv obj@images$slice1@coordinates (空间坐标数据)
tissue_lowres_image.png obj@images$slice1@image (低分辨率图像,用于可视化)
tissue_hires_image.png 可选,高分辨率图片,一般不自动加载,可用自定义读取
scalefactors_json.json obj@[email protected] (空间坐标的尺度因子,用于定位spot在图片中的位置)

Python

文件 对象中位置
matrix.mtx、features.tsv、barcodes.tsv adata.Xadata.layers['counts'] 原始表达数据
基因名:adata.var_names
Spot名:adata.obs_names
tissue_positions_list.csv adata.obsm['spatial'] (空间坐标数据)
tissue_lowres_image.png adata.uns['spatial'][sample]['images']['lowres'] (低分辨率图)
tissue_hires_image.png adata.uns['spatial'][sample]['images']['hires'] (高分辨率图)
scalefactors_json.json adata.uns['spatial'][sample]['scalefactors'] (坐标与图片对应的尺度因子)

对比

数据内容 文件位置(原始数据) Seurat对象 AnnData对象
表达矩阵(基因表达数据) matrix.mtx + features.tsv + barcodes.tsv assays$Spatial@counts/data Xlayers['counts']
基因名称 features.tsv rownames(counts矩阵) adata.var_names
Spot名称 barcodes.tsv colnames(counts矩阵) adata.obs_names
空间坐标 (x, y) tissue_positions_list.csv images$slice1@coordinates obsm['spatial']
空间组织图像 (低分辨率) tissue_lowres_image.png images$slice1@image uns['spatial'][sample]['images']['lowres']
空间组织图像 (高分辨率) tissue_hires_image.png 一般不默认加载,需要额外读取 uns['spatial'][sample]['images']['hires']
尺度因子(坐标映射到图片) scalefactors_json.json [email protected] uns['spatial'][sample]['scalefactors']