空间转录组分析-03-adata的读取与保存

Anndata对象的读取

直接读取

scanpy.read_visium()可以直接从Space Ranger生成的outs/文件夹进行读取空转数据,在这种情况下只需要指定outs/文件夹的位置即可。然而,目前scanpy已经不能直接读取SpaceRanger2.0版本之后的输出文件(可以修改部分输出文件名勉强读取)。因此对于最新的空转数据建议都是使用squidpy.read_visium()进行读取。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 这种方法在scanpy v.1.11.0之后已经废弃!应切换至squidpy库中的sq.read.visium()进行读取
import scanpy as sc
adata = sc.read_visium('PC1/outs') # 在新版本中已经废弃

# 切换成squidpy
import squidpy as sq
adata = sq.read.visium(
	path = 'PC1/outs',
    library_id = 'PC1'
)
读取保存的h5ad文件

使用scanpy.read_h5ad即可:

1
2
import scanpy as sc
adata = sc.read('sample.h5ad')
从原始文件手动构建

假如缺失某些数据而只用部分数据构建Anndata对象时,可以通过代码手动进行构建:

1、导入相关的包

1
2
3
4
import scanpy as sc
import numpy as np
import pandas as pd
from scipy.io import mmread

2、读取文件,即表达矩阵(matrix.mtx.gz)、barcode(barcode.tsv.gz)以及基因的特征(features.tsv.gz)

1
2
3
4
5
6
7
# 读取文件,即表达矩阵(matrix.mtx.gz)、barcode(barcode.tsv.gz)以及基因的特征(features.tsv.gz)
counts = mmread("PC1/outs/filtered_feature_bc_matrix/matrix.mtx.gz").tocsr()  # 转化为稀疏矩阵
features = pd.read_csv("PC1/outs/filtered_feature_bc_matrix/features.tsv.gz", sep="\t", header=None, names=["gene_ids", "gene_name", "feature_types"])
barcodes = pd.read_csv("PC1/outs/filtered_feature_bc_matrix/barcodes.tsv.gz", sep="\t", header=None, names=["barcode"])

# 如果有h5文件可以使用sc.read_10x_h5()函数进行读取,结果同前
# adata = sc.read_10x_h5('PC1/outs/filtered_feature_bc_matrix.h5')

3、创建Anndata对象

1
2
3
4
5
6
# 创建Anndata对象
adata = sc.AnnData(
    X=counts.T,  # 转置矩阵(基因 x 细胞 → 细胞 x 基因)
    obs=barcodes.set_index('barcode'),
    var=features.set_index("gene_name")
)

4、读取tissue_positions.csv(即spots的metadata信息),将对应信息存储至adata.obs或adata.obsm中

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 读取tissue_positions.csv,里面存储了每个spots(即barcode)的metadata。对于旧版CellRanger的输出文件应该为tissue_posistion_list.tsv
# 此外,tissue_positions.csv中"pxl_row_in_fullres", "pxl_col_in_fullres"里都是浮点数存储的,在某些旧版的软件中可能会报错,必要时修改源码,或将数据转为整数
positions = pd.read_csv('PC1/outs/spatial/tissue_positions.csv', header=None)
positions.columns = ["barcode", "in_tissue", "array_row", "array_col", "pxl_row_in_fullres", "pxl_col_in_fullres"]

# 合并到 adata.obs
adata.obs = adata.obs.merge(positions.set_index("barcode"), left_index=True, right_index=True)

# 保存坐标到 obsm
# 【重要!】scanpy中默认 (x, y) = (col, row),不要写成(col,row)
adata.obsm["spatial"] = adata.obs[["pxl_col_in_fullres", "pxl_row_in_fullres"]].values

5、载入图片

1
2
3
from imageio.v2 import imread
hires_img = imread("PC1/outs/spatial/tissue_hires_image.png")
lowres_img = imread("PC1/outs/spatial/tissue_lowres_image.png")

6、载入缩放因子

1
2
3
import json
with open("PC1/outs/spatial/scalefactors_json.json", "r") as f:
    scalefactors = json.load(f)

7、将图片RGB数组和缩放因子以字典的形式存放至adata.uns

1
2
3
4
5
6
7
8
9
adata.uns["spatial"] = {
    "PC1": {                          # Sample_id  
        "images": {
            "hires": hires_img,
            "lowres": lowres_img
        },
        "scalefactors": scalefactors  # 直接使用从 JSON 读取的缩放因子
    }
}

Anndata对象的保存

Anndata对象自带属性.write('file_name'),可以很方便地保存:

1
2
# 保存为h5ad文件,即 HDF5-based AnnData 格式
adata.write('file_name.h5ad')

Anndata和Seurat对象互相转换

1
2
3
4
5
6
7
# 创建新的conda环境
conda create -n scdiopy python==3.8
conda activate scdiopy

# 安装python包
pip install diopy
pip install scanpy==1.9.6 numpy==1.21.3 numba==0.57.1
welcome to my blog
使用 Hugo 构建
主题 StackJimmy 设计