本⽂档是关于寻因SeekSpace技术所得到的数据及其分析⽅法的说明。
寻因SeekSpace技术可以检测到单细胞精度的基因表达数据,同时也能定位出每个细胞在组织中的空间坐标。
SeekSpace的数据分析简便易学,能够很方便地兼容常见单细胞转录组的分析软件,例如seurat和scanpy。
本数据为基于SeekSpace技术的⼩⿏(8周龄)脑的空间数据。数据中包含9,333个细胞的单细胞转录组矩阵,空间坐标矩阵和组织DAPI染⾊图⽚。
SeekSpace技术的配套的基础数据处理的软件是SeekSpace tools,该软件可以从测序文库中识别细胞的表达信息,同时可以识别出每个细胞在空间上的位置。
经过SeekSpace tools软件处理之后所得到的结果文件格式如下:
├── filtered_feature_bc_matrix # 表达矩阵⽬录,可以使⽤seurat的Read10X命令进⾏读取
│ ├── barcodes.tsv.gz
│ ├── features.tsv.gz
│ └── matrix.mtx.gz
├── mouse_brain_aligned_cropped.png # 为⼩⿏脑组织切⽚的DAPI染⾊图⽚
├── seurat.ipynb # 为使⽤seurat分析该⼩⿏脑空间数据的jupyter示例⽂件
└── spatial_matrix.csv # 为⼩⿏脑测序数据中细胞的空间坐标⽂件。第1列是barcode,顺序与
matrix中的filtered_feature_bc_matrix/barcode中细胞的顺序⼀致;第2列和第3列分别为该barcode所代表的细胞的空间位置(即空间芯⽚上的像素坐标)。
SeekSpace技术中一个像素点的大小是约为 0.2653 微米,将像素点的坐标乘以 0.2653 即可转换计算细胞在真实空间上的距离。
这⾥以seurat软件为例,来介绍SeekSpace数据的分析。
具体步骤如下:
第⼀步,读取SeekSpace的矩阵⽂件,并聚类。
(这⾥的代码可以根据⾃⼰的⽬的进⾏修改,只要是符合seurat分析单细胞转录组的要求即可。)
library(Seurat)
library(dplyr)
library(base64enc)
这里直接使用seurat常用的读入和创建矩阵的方法即可。
mouse_brain.data <- Read10X('./filtered_feature_bc_matrix')
mouse_brain <- CreateSeuratObject(counts=mouse_brain.data,project='mouse_brain')
这里使用常见的默认参数进行降维聚类,实际分析的时候,可以按照样品的特征进行相应的修改。
mouse_brain <- NormalizeData(mouse_brain, normalization.method = "LogNormalize", scale.factor = 10000) %>%
FindVariableFeatures(selection.method = "vst", nfeatures = 2000) %>%
ScaleData() %>%
RunPCA() %>%
FindNeighbors(dims = 1:30) %>%
FindClusters(resolution = 0.8) %>%
RunUMAP(dims = 1:30)
接下来我们使用seurat的CreateDimReducObject函数,给seurat对象中的每个细胞添加一个空间的坐标。
注意!!
CreateDimReducObject函数读入空间坐标矩阵的细胞的顺序必须与mouse_brain里面的meta.data里面细胞的顺序相一致,否则在多样品整合分析的时候会出现细胞顺序错乱的情况。
这里我们使用了一个简单的一行代码对空间坐标矩阵进行了排序。
spatial_df <- read.csv('./spatial_matrix.csv', row.names = 1)
spatial_matrix <- as.matrix(spatial_df)
spatial_matrix_sorted <- spatial_matrix[match(row.names(mouse_brain@meta.data),row.names(spatial_matrix)), ]
mouse_brain@reductions$spatial <- CreateDimReducObject(embeddings = spatial_matrix_sorted, key='spatial_', assay='RNA')
经过这步处理之后,我们可以在seurat对象中看到一个新的坐标系”spatial“,这个坐标系即为每个细胞在空间位置上的坐标。
接下来我们再把细胞的注释结果添加到每个细胞上,这样我们就可以看不同的细胞类型在空间上的分布情况了。
SeekSpace细胞注释的过程,跟普通的单细胞注释的过程完全一致。
我们之前已经对demo数据进行了大群和亚群的注释,注释的结果文件放在了anntation.csv文件中。
接下来我们简单的读入处理一下。
anno <- read.csv("./annotation.csv",row.names = 1,header = TRUE)
mouse_brain$cell_bc <- row.names(mouse_brain@meta.data)
mouse_brain@meta.data <- left_join(mouse_brain@meta.data,anno,by = "cell_bc")
row.names(mouse_brain@meta.data) <- mouse_brain$cell_bc
mouse_brain %>% head
orig.ident | nCount_RNA | nFeature_RNA | RNA_snn_res.0.8 | seurat_clusters | cell_bc | Main.CellType | subcluster | |
---|---|---|---|---|---|---|---|---|
<fct> | <dbl> | <int> | <fct> | <fct> | <chr> | <chr> | <chr> | |
AAACCCATACATAGTGT | mouse_brain | 3185 | 1660 | 3 | 3 | AAACCCATACATAGTGT | Oligo | Oligo_2 |
AAACCCATACCGCTTCG | mouse_brain | 10962 | 3603 | 9 | 9 | AAACCCATACCGCTTCG | Ext | Ext_L56 |
AAACCCATACGCTCTAT | mouse_brain | 1695 | 988 | 2 | 2 | AAACCCATACGCTCTAT | Ext | Ext_L23 |
AAACCCATACTCATAGA | mouse_brain | 1303 | 867 | 6 | 6 | AAACCCATACTCATAGA | Ext | Ext_L56 |
AAACCCATACAAGCCTG | mouse_brain | 16009 | 4551 | 13 | 13 | AAACCCATACAAGCCTG | Ext | Ext_L5_2 |
AAACCCATACATTCGAA | mouse_brain | 17436 | 4947 | 9 | 9 | AAACCCATACATTCGAA | Ext | Ext_L56 |
AAACCCATACCTAGCCT | mouse_brain | 16651 | 4843 | 6 | 6 | AAACCCATACCTAGCCT | OPC | OPC_2 |
AAACCCATACGGCTGTG | mouse_brain | 2876 | 1639 | 17 | 17 | AAACCCATACGGCTGTG | Inh | Inh_6 |
AAACCCATACTCTCCTC | mouse_brain | 2255 | 1225 | 1 | 1 | AAACCCATACTCTCCTC | Ext | Ext_Unk_3 |
AAACCCATACACCAGCA | mouse_brain | 7682 | 2997 | 6 | 6 | AAACCCATACACCAGCA | Ext | Ext_L56 |
我们可以继续使用seurat包默认的一系列函数进行绘图
我们先绘制一些较为常见的图形,比如降维聚类图和基因表达的图。
DimPlot(mouse_brain) + DimPlot(mouse_brain, group.by = "Main.CellType")
FeaturePlot(mouse_brain, reduction = 'umap', features=c('Mbp','Mobp', 'Olig1','Plp1'), pt.size = 1)
当我们把 DimPlot 函数中的 reduction 参数设置为 "spatial" 的时候,我们即可将细胞绘制在空间水平上。
# 空间坐标
DimPlot(mouse_brain, reduction = 'spatial',pt.size = 1)
DimPlot(mouse_brain, reduction = 'spatial',pt.size = 1,group.by = "Main.CellType")
DimPlot(mouse_brain, reduction = 'spatial',pt.size = 1,group.by = "subcluster")
同样,我们可以在使用FeaturePlot 函数时,将reduction参数设置为"spatial",来查看基因在空间位置上的表达情况。
FeaturePlot(mouse_brain, reduction = 'spatial', features = c('Gad2','Hpca','Reln','Pvalb','Mbp'),pt.size = 1.2)
SeekSpace数据对Seurat的兼容性比较好,取子集等等函数均可运行。
subset_obj <- subset(mouse_brain, Main.CellType == 'Ext')
DimPlot(subset_obj, reduction = 'spatial',pt.size = 1.2,group.by = "subcluster")
下面我们展示一下在空间数据上添加背景图片。
# add image info
img = './mouse_brain_aligned_cropped.png'
samplename = 'mouse_brain'
size_x = 50094
size_y = 20570
img_64 = base64enc::dataURI(file = img)
mouse_brain@misc$info[[`samplename`]]$img = img_64
mouse_brain@misc$info[[`samplename`]]$size_x = as.integer(size_x)
mouse_brain@misc$info[[`samplename`]]$size_y = as.integer(size_y)
mouse_brain@misc
library(plotly)
# 添加染色图片
# Here, I would like to thank the generous Dr. Zhou Ran.
addBgImage <- function(p, obj, size_x, size_y, base64) {
p_plotly <- ggplotly(p)
my_layout <- list(
xaxis = list(
range = c(0,size_x),
scaleanchor = 'y',
scaleratio = 1,
tickcolor = 'gray',
showgrid = FALSE,
visible= FALSE
),
yaxis = list(
range = c(0,size_y),
ticks = 'outside',
showgrid = FALSE,
visible= FALSE
),
width = 1000,
height = 600,
images = list(
list(
source = base64,
xref = "x",
yref = "y",
sizing = 'stretch',
layer = "below",
x = 0,
y = size_y,
sizex = size_x,
sizey = size_y
)
)
)
p_plotly$x$layout <- my_layout
return (p_plotly)
}
p1 = DimPlot(mouse_brain, reduction = 'spatial', pt.size = 0.1, group.by = "subcluster") + coord_fixed()
size_x = mouse_brain@misc$info$mouse_brain$size_x
size_y = mouse_brain@misc$info$mouse_brain$size_y
base64 = mouse_brain@misc$info$mouse_brain$img
p1_with_img = addBgImage(p1, mouse_brain, size_x, size_y, base64)
p1_with_img
sessionInfo()
R version 4.3.2 (2023-10-31) Platform: x86_64-conda-linux-gnu (64-bit) Running under: Debian GNU/Linux 11 (bullseye) Matrix products: default BLAS/LAPACK: /PROJ2/development/zhangguangxin/02.software/01.mamba/envs/myenv/lib/libopenblasp-r0.3.25.so; LAPACK version 3.11.0 locale: [1] LC_CTYPE=C.UTF-8 LC_NUMERIC=C LC_TIME=C.UTF-8 [4] LC_COLLATE=C.UTF-8 LC_MONETARY=C.UTF-8 LC_MESSAGES=C.UTF-8 [7] LC_PAPER=C.UTF-8 LC_NAME=C LC_ADDRESS=C [10] LC_TELEPHONE=C LC_MEASUREMENT=C.UTF-8 LC_IDENTIFICATION=C time zone: Asia/Shanghai tzcode source: system (glibc) attached base packages: [1] stats graphics grDevices utils datasets methods base other attached packages: [1] plotly_4.10.3 ggplot2_3.4.4 base64enc_0.1-3 dplyr_1.1.4 [5] SeuratObject_5.0.0 Seurat_4.4.0 loaded via a namespace (and not attached): [1] deldir_2.0-2 pbapply_1.7-2 gridExtra_2.3 [4] rlang_1.1.2 magrittr_2.0.3 RcppAnnoy_0.0.21 [7] spatstat.geom_3.2-7 matrixStats_1.2.0 ggridges_0.5.5 [10] compiler_4.3.2 png_0.1-8 vctrs_0.6.5 [13] reshape2_1.4.4 stringr_1.5.1 pkgconfig_2.0.3 [16] crayon_1.5.2 fastmap_1.1.1 ellipsis_0.3.2 [19] labeling_0.4.3 utf8_1.2.4 promises_1.2.1 [22] purrr_1.0.2 jsonlite_1.8.8 goftest_1.2-3 [25] later_1.3.2 uuid_1.1-1 spatstat.utils_3.0-4 [28] irlba_2.3.5.1 parallel_4.3.2 cluster_2.1.6 [31] R6_2.5.1 ica_1.0-3 spatstat.data_3.0-3 [34] stringi_1.8.3 RColorBrewer_1.1-3 reticulate_1.34.0 [37] parallelly_1.36.0 lmtest_0.9-40 scattermore_1.2 [40] Rcpp_1.0.11 IRkernel_1.3.2 tensor_1.5 [43] future.apply_1.11.1 zoo_1.8-12 R.utils_2.12.3 [46] sctransform_0.4.1 httpuv_1.6.13 Matrix_1.6-1.1 [49] splines_4.3.2 igraph_1.5.1 tidyselect_1.2.0 [52] yaml_2.3.8 abind_1.4-5 spatstat.random_3.2-2 [55] codetools_0.2-19 miniUI_0.1.1.1 spatstat.explore_3.2-5 [58] listenv_0.9.0 lattice_0.22-5 tibble_3.2.1 [61] plyr_1.8.9 withr_2.5.2 shiny_1.8.0 [64] ROCR_1.0-11 evaluate_0.23 Rtsne_0.17 [67] future_1.33.1 survival_3.5-7 polyclip_1.10-6 [70] fitdistrplus_1.1-11 pillar_1.9.0 KernSmooth_2.23-22 [73] generics_0.1.3 sp_2.1-2 IRdisplay_1.1 [76] munsell_0.5.0 scales_1.3.0 globals_0.16.2 [79] xtable_1.8-4 glue_1.6.2 lazyeval_0.2.2 [82] tools_4.3.2 data.table_1.14.10 pbdZMQ_0.3-10 [85] RANN_2.6.1 leiden_0.4.3.1 dotCall64_1.1-1 [88] cowplot_1.1.2 grid_4.3.2 tidyr_1.3.0 [91] crosstalk_1.2.1 colorspace_2.1-0 nlme_3.1-164 [94] patchwork_1.1.3 repr_1.1.6 cli_3.6.2 [97] spatstat.sparse_3.0-3 spam_2.10-0 fansi_1.0.6 [100] viridisLite_0.4.2 uwot_0.1.16 gtable_0.3.4 [103] R.methodsS3_1.8.2 digest_0.6.33 progressr_0.14.0 [106] ggrepel_0.9.4 farver_2.1.1 htmlwidgets_1.6.4 [109] R.oo_1.25.0 htmltools_0.5.7 lifecycle_1.0.4 [112] httr_1.4.7 mime_0.12 MASS_7.3-60