
之前介绍过空转h5ad转seurat的操作(空转python版【2】:visium空转h5ad数据转化为seurat测试)。类似于scRNA一样,小伙伴对于空转seurat转h5ad有很大的需求。但是网上没有直接的方式或者说简洁的办法能够轻松实现空转数据的转化。这里以visium空转为例,介绍两种方式,第一种是比较迂回的路线,也算是后续函数的思路。第二种方式整合了一个函数,能够一步到位实现空转visium seurat到h5ad的转化,且相当于统一了scRNA以及空转的转化,次函数也能实现普通房scRNA数据seurat转化为h5ad。对于空转,函数只适用于单个sample的转化!
首先看看示例数据:
#R中演示
#----------------------------------------------------------------------------------
#我们这里演示的visium数据包含多个样本,提取单个的进行演示
#多个的数据其实也是需要先分开在进行转化的
library(Seurat)
CTR3 <- subset(merged,orig.ident=='CTR3')
#查看整合的降维UMAP
color_pal<-c("#11A579","#F2B701","#66C5CC","#80BA5A","#F6CF71","#7F3C8D","#CF1C90","#3969AC","#f97b72","#E73F74","#4b4b8f","#ACA4E2","#31C53F","#B95FBB","#D4D915","#28CECA")
DimPlot(CTR3, reduction = "umap", label = F, pt.size = 0.5,cols = color_pal)
#可视化slice
SpatialDimPlot(CTR3, stroke=0.1)& #如果spots不需要边框,设置stroke=NA
scale_fill_manual(values = color_pal)
#----------------------------------------------------------------------------------
第一种方式:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import anndata as ad
import scanpy as sc
import squidpy as sq#这里我是直接使用转化好的演示,转化的数据只有矩阵信息,没有image
CTR3 = sc.read_h5ad('./CTR3.h5ad')
CTR3
# AnnData object with n_obs × n_vars = 1801 × 18274
# obs: 'orig.ident', 'nCount_Spatial', 'nFeature_Spatial', 'group', 'percent.mt', 'nCount_SCT', 'nFeature_SCT', 'nCount_RNA', 'nFeature_RNA', 'integrated_snn_res.0.6', 'seurat_clusters'
# obsm: 'pca', 'umap'sc.pl.umap(CTR3,color='seurat_clusters')
#因为之前的数据分析是整合的,所以原有的barcode加了后缀,为了与原始的一致,需要处理一下,把多余添加的后缀去除
#这里的处理是直接使用replace将“_1“替换掉就可以了
CTR3.obs_names = CTR3.obs_names.str.replace(r'_1$', '', regex=True)#读入tissue_positions文件并过滤在组织上的spots
pos = pd.read_csv('./visium/CTR3_processed_data/spatial/tissue_positions.csv')
pos = pos.set_index("barcode")
pos = pos.loc[pos.index.isin(CTR3.obs_names)]#添加坐标
CTR3.obs = CTR3.obs.merge(pos, left_index=True, right_index=True, how="left")
pxr, pxc = "pxl_row_in_fullres", "pxl_col_in_fullres"
CTR3.obsm["spatial"] = CTR3.obs[[pxc, pxr]].to_numpy()#添加image
import json
import os
from PIL import Image
with open(os.path.join('./visium/CTR3_processed_data/spatial/scalefactors_json.json'), "r") as fh:
scales = json.load(fh)
img_hires = np.array(Image.open(os.path.join('./visium/CTR3_processed_data/spatial/tissue_hires_image.png')))
img_low = np.array(Image.open(os.path.join('./visium/CTR3_processed_data/spatial/tissue_lowres_image.png')))
#加入adata
lib_id = 'CTR3'
CTR3.uns["spatial"] = {
lib_id: {"images": {"hires": img_hires, "lowres": img_low}, "scalefactors": scales, "metadata": {}}
}CTR3AnnData object with n_obs × n_vars = 1801 × 18274
obs: 'orig.ident', 'nCount_Spatial', 'nFeature_Spatial', 'group', 'percent.mt', 'nCount_SCT', 'nFeature_SCT', 'nCount_RNA', 'nFeature_RNA', 'integrated_snn_res.0.6', 'seurat_clusters', 'in_tissue', 'array_row', 'array_col', 'pxl_row_in_fullres', 'pxl_col_in_fullres'
uns: 'seurat_clusters_colors', 'spatial'
obsm: 'pca', 'umap', 'spatial'sq.pl.spatial_scatter(CTR3)
sc.pl.spatial(CTR3, img_key="lowres", color="seurat_clusters", size=1.5)
转化没有问题,但是很显然非常的麻烦!
所以,重点来了!
看看我们函数的参数(函数需要提供image):对于scRNA数据,参数include_spatial选择F进行数据的转化,空转数据转化设置为T。

#转化演示
setwd("/home/ks_ts/data_analysis/Spatial_analysis/")
ks_convert_seurat_to_h5ad(seurat_obj = CTR3,h5ad_file_path = './',
image_path = "./visium/CTR3_processed_data/spatial/",
use_counts = FALSE,use_data = TRUE,
assay = 'SCT',include_spatial = T)#读入转化号的数据
CTR3 = sc.read_h5ad('./CTR3.h5ad')
CTR3
# AnnData object with n_obs × n_vars = 1801 × 18274
# obs: 'orig.ident', 'nCount_Spatial', 'nFeature_Spatial', 'group', 'percent.mt', 'nCount_SCT', 'nFeature_SCT', 'nCount_RNA', 'nFeature_RNA', 'integrated_snn_res.0.6', 'seurat_clusters'
# uns: 'spatial'
# obsm: 'pca', 'spatial', 'umap'可以看到,转化后的数据矩阵、降维、image信息都包括!
sq.pl.spatial_scatter(CTR3)
sq.pl.spatial_scatter(CTR3,color="seurat_clusters", size=1.5)
觉得分享有用的点个赞再走呗!