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
|