R-seurat

R-seurat#

1. Seurat对象的整体结构#

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

  • Assays:存储表达矩阵和相关的数据(如空间转录组数据,通常为"Spatial")。

  • Meta data:样本、细胞、或者空间spot级别的元数据。

  • Dimensional Reductions:PCA、UMAP、tSNE等降维分析的结果。

  • Images:空间转录组中特有的组件,存储组织图像信息和空间坐标。

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数据为例:

空转数据的读取方式

1. 读取Visium数据#

方法1:直接读取10x Visium格式文件(.h5)#

sample1 = sc.read_visium('./GSM7996201_SXR_1')
sample2 = sc.read_visium('./GSM7996202_SXR_2')
sample3 = sc.read_visium('./GSM7996203_YZL_1')
sample4 = sc.read_visium('./GSM7996204_YZL_2')

samples = [sample1, sample2, sample3, sample4] 
# 添加批次信息 
for i, sample in enumerate(samples): sample.obs['batch'] = f'sample_{i+1}' 
# 合并数据 
combined = samples[0].concatenate(samples[1:]) 
# 批次效应校正 
sc.pp.combat(combined, key='batch')

如果是matrix.mtx、features.tsv、barcodes.tsv和spatial目录#

sc.settings.cachedir = "/home/sunlab/yanghc/workspace/project/TNBC_spatial/test/visium/cache" 
 adata = sc.read_10x_mtx(
        sample_path,  # 包含matrix.mtx.gz等文件的目录
        var_names='gene_symbols',
        cache=True
    )
# 2. 读取空间位置信息
    spatial_path = os.path.join(sample_path, 'spatial')
    positions_path = os.path.join(spatial_path, 'tissue_positions.csv')
    positions = pd.read_csv(positions_path)

# 3. 调整位置数据格式 (检查列名以确保正确)
    # 注意: 根据10x的版本,positions的列名可能有不同
    if 'barcode' not in positions.columns and positions.shape[1] == 6:
        positions.columns = ['barcode', 'in_tissue', 'array_row', 'array_col', 
                            'pxl_row_in_fullres', 'pxl_col_in_fullres']
    
    # 设置barcode为索引
    positions.index = positions['barcode']

# 4. 匹配表达矩阵和空间位置的细胞条形码
    common_barcodes = positions.index.intersection(adata.obs_names)
    if len(common_barcodes) < len(adata.obs_names):
        print(f"  警告: 只有{len(common_barcodes)}/{len(adata.obs_names)}的条形码在空间数据中找到")
    
    adata = adata[common_barcodes]
    positions = positions.loc[common_barcodes]
    
# 5. 将空间坐标添加到adata对象中
    adata.obs['in_tissue'] = positions['in_tissue'].values
    adata.obsm['spatial'] = positions[['pxl_row_in_fullres', 'pxl_col_in_fullres']].values
    
# 6. 读取比例因子
    scalefactors_path = os.path.join(spatial_path, 'scalefactors_json.json')
    with open(scalefactors_path, 'r') as f:
        scalefactors = json.load(f)
    
# 7. 正确设置空间可视化信息
    library_id = sample_id  # 使用样本ID作为库ID
    adata.uns['spatial'] = {}
    adata.uns['spatial'][library_id] = {}
    
# 8. 添加组织图像
    hires_path = os.path.join(spatial_path, 'tissue_hires_image.png')
    lowres_path = os.path.join(spatial_path, 'tissue_lowres_image.png')
    adata.uns['spatial'][library_id]['images'] = {}
    try:
        adata.uns['spatial'][library_id]['images']['hires'] = io.imread(hires_path)
        adata.uns['spatial'][library_id]['images']['lowres'] = io.imread(lowres_path)
    except Exception as e:
        print(f"  警告: 无法读取图像: {e}")
    
# 9. 添加比例因子
    adata.uns['spatial'][library_id]['scalefactors'] = scalefactors