library(ggplot2)
library(Seurat)
library(SPATA2)
library(dplyr)
source('runVectorFields.R')
source('plotVectorFields.R')
####脚本放在最后
x = readRDS(Seurat.spatial.rds)
y = transformSeuratToSpata(seurat_object = x, sample_name = 'FT')
####这个时候我们把需要分析的轨迹基因、通路或者细胞类型进行分析,这里以CD3D为例
data = runVectorFields(y,'CD3D')
head(data)
p = plotVectorFields(data,'CD3D')
pdf('eg.pdf')
print(p)
dev.off()
runVectorFields <- function(object,
features,
cut_off=NULL,
normalize=T,
smooth=T,
smooth_span=NULL,
dist.spot=10,
run.mcor=T,
workers=8,
ram=50){
# Get the data:
df <- SPATA2::hlpr_join_with_aes(object,
df = SPATA2::getCoordsDf(object),
color_by = features,
normalize = normalize,
smooth = smooth,
smooth_span=smooth_span)
if(!is.null(cut_off)){df[df[,features]<cut_off, features]=0}
# Prepare data ------------------------------------------------------------
NN.file <- SPATAwrappers::getSurroundedSpots(object)
if(run.mcor==T){
base::options(future.fork.enable = TRUE)
future::plan("multisession", workers = workers)
future::supportsMulticore()
base::options(future.globals.maxSize = ram *100* 1024^2)
message("... Run multicore ... ")
}
if(dist.spot<min(NN.file %>% filter(distance!=0) %>% pull(distance))){
dist.spot <-min(NN.file %>% filter(distance!=0) %>% pull(distance))
message(paste0("The distance was adopted for the minimal distance: ",dist.spot, "px"))}
VF <- furrr::future_map(.x=1:nrow(df), .f=function(i){
#Spot Def.
bc <- df[i, c("barcodes")]
cc <- df[i, c("x", "y")]
#Neighbour Spots
NN <-
NN.file %>%
dplyr::filter(xo < cc$x+dist.spot & xo > cc$x-dist.spot) %>%
dplyr::filter(yo < cc$y+dist.spot & yo > cc$y-dist.spot) %>%
dplyr::pull(bc_destination)
#Filter input DF
NN.df <- df %>% dplyr::filter(barcodes %in% NN) %>% as.data.frame()
parameter <- features
#Create Vector
V <- -c(as.numeric(cc) - c(NN.df$x[which.max(NN.df[,parameter])], NN.df$y[which.max(NN.df[,parameter])]))
if(length(V)==0){out <- data.frame(barcodes=bc, t.x=0, t.y=0)}else{out <- data.frame(barcodes=bc, t.x=V[1], t.y=V[2])}
return(out)
}, .progress = T) %>%
do.call(rbind, .) %>%
as.data.frame()
out <- cbind(df, VF)
out[is.na(out)] <- 0
return(out)
}
plotVectorFields <- function(VF, parameter, pt.size=6,pt.alpha=0.8,color.extern=NULL,skip=1){
VF <-
VF %>%
dplyr::select(x,y,{{parameter}}, t.x, t.y) %>%
dplyr::rename("parameter":=!!sym(parameter))
color.points <- VF$parameter
if(!is.null(color.extern)){color.points <- color.extern}
if(color.points %>% class()=="factor"){
p <-
ggplot2::ggplot(data=VF, aes(x,y))+
ggplot2::geom_point(data=VF , mapping=aes(x,y, color=color.points), size=pt.size, alpha=pt.alpha)+
metR::geom_vector(aes(dx = t.x, dy = t.y),skip=skip) +
metR::scale_mag()+
ggplot2::theme_void()+
Seurat::NoLegend()
}else{
p <-
ggplot2::ggplot(data=VF, aes(x,y))+
ggplot2::geom_point(data=VF , mapping=aes(x,y, color=color.points), size=pt.size, alpha=pt.alpha)+
ggplot2::scale_color_viridis_c(guide = "none")+
metR::geom_vector(aes(dx = t.x, dy = t.y),skip=skip) +
ggplot2::theme_void()+
Seurat::NoLegend()+
metR::scale_mag()
}
return(p)
}
生活很好,有你更好,祝打赏的老板们国庆快乐