Spaces:
Running
Running
title: "PFCdev-web" | |
author: "Cao Lab" | |
server: shiny | |
format: | |
dashboard: | |
theme: flatly | |
logo: https://ZhengTiger.github.io/picx-images-hosting/PFCdev/Logo.3yemp7xp5k.webp | |
nav-buttons: | |
- icon: github | |
href: https://github.com/ZhengTiger/PFC_develop | |
# Home | |
<p style="font-size: 50px; font-weight: bold; text-align: center;">Single-cell spatiotemporal transcriptome dynamics of mouse prefrontal cortex intratelencephalic neurons during postnatal development</p> | |
<br> | |
<img src="https://ZhengTiger.github.io/picx-images-hosting/PFCdev/Figure1A.3yer620cdm.webp" style="width: 100%;"> | |
<br> | |
<br> | |
<p style="font-size: 30px; font-weight: bold; text-align: left;"> | |
Summary | |
</p> | |
<p style="font-size: 20px; text-align: justify;"> | |
The prefrontal cortex (PFC) is a core regulatory center for higher cognitive functions in the mammalian brain. In early postnatal mice, the PFC remains incompletely mature, particularly the intratelencephalic (IT) neurons located in superficial layers. However, the molecular developmental trajectories and regulatory mechanisms of IT neurons during the critical postnatal period (1-2 weeks) for circuit establishment, remain poorly characterized at single-cell resolution. Here, we performed single-cell RNA sequencing analysis on mouse PFC isolated at different developmental time points, and integrated with spatial transcriptomic data. Our study systematically deciphered the spatiotemporal transcriptome dynamics of mouse PFC during postnatal development, with particular emphasis on the heterogeneity of IT neurons. We identified dynamically expressed genes during postnatal development, including cadherin and axon guidance molecule genes, as well as specific transcriptional regulators that control the maturation of IT neurons in different layers. Furthermore, we also revealed that glial cells play crucial regulatory roles in IT neuron development through specific signaling pathways. Our study provides a comprehensive single-cell atlas of postnatal mouse PFC development, offering important insights into the mechanisms of neural development and circuit assembly in PFC. | |
</p> | |
<br> | |
<p style="font-size: 30px; font-weight: bold; text-align: left;"> | |
Interactively exploring our data | |
</p> | |
<p style="font-size: 20px; font-weight: bold; text-align: left;"> | |
scRNAseq | |
</p> | |
<p style="font-size: 20px; text-align: justify;"> | |
Our scRNAseq data sequenced the PFC of mice at four different stages (P1, P4, P10, Adult). Users can browse the following content through the scRNAseq page: | |
</p> | |
- Select dataset: Select datasets containing different cell types | |
- Select celltype: Select different resolutions to view cell clusters on UMAP | |
- Select gene: Select different genes to view their expression | |
<p style="font-size: 20px; font-weight: bold; text-align: left;"> | |
Spatial data | |
</p> | |
<p style="font-size: 20px; text-align: justify;"> | |
We collected the whole brain stereo-seq datasets of P1 and Adult mice from [(Han et al., Neuron, 2025)](https://doi.org/10.1016/j.neuron.2025.02.015), extracted and analyzed the PFC brain region. Users can browse the following content through the spatial page: | |
</p> | |
- Spatial Clustering: Select different cell subtypes to view their spatial distribution | |
- Spatial Gene Expression: Select different genes to view their spatial expression | |
<p style="font-size: 20px; font-weight: bold; text-align: left;"> | |
Download | |
</p> | |
<p style="font-size: 20px; text-align: justify;"> | |
Download the raw and processed data from this study. | |
</p> | |
```{r} | |
#| context: setup | |
#| warning: false | |
#| message: false | |
library(ggplot2) | |
library(Seurat) | |
library(shiny) | |
library(rgl) | |
library(ggdark) | |
library(viridis) | |
library(dplyr) | |
source("R/Palettes.R") | |
# scrnaseq | |
seu.downsample <- readRDS('data/seu.all.HVGs.rds') | |
seu.downsample$orig.ident <- factor(seu.downsample$orig.ident, | |
levels = c("P0","P4","P10","Adult")) | |
seu.downsample$SubType <- seu.downsample$SubType_v4 | |
# spatial | |
column <- c("x_rotated","y_rotated","Im.L2.3.IT","Im.L4.5.IT","Im.L5.IT","Im.L6.IT","L2.3.IT","L4.5.IT","L5.IT","L6.IT","L5.PT","L5.NP","L6.CT","Lamp5","Pvalb","Sst","Vip","NPC","Astro","Endo","Microglia","Oligo","OPC") | |
P1_cell2loc <- read.csv("data/P1_cell2location.csv", row.names = 1) | |
P1_cell2loc <- P1_cell2loc[,column] | |
P1_cell2loc$Endo <- 0 | |
P1_cell2loc$Oligo <- 0 | |
colnames(P1_cell2loc) <- c("x_rotated","y_rotated",names(col_cluster[["SubType"]])) | |
P1_cell2loc$SubType <- as.character(apply(P1_cell2loc[,names(col_cluster[["SubType"]])[-18]], 1, function(x){ | |
names(which.max(x)) | |
})) | |
P77_cell2loc <- read.csv("data/P77_cell2location.csv", row.names = 1) | |
P77_cell2loc <- P77_cell2loc[,column] | |
P77_cell2loc$Endo <- 0 | |
colnames(P77_cell2loc) <- c("x_rotated","y_rotated",names(col_cluster[["SubType"]])) | |
P77_cell2loc$SubType <- as.character(apply(P77_cell2loc[,names(col_cluster[["SubType"]])[-18]], 1, function(x){ | |
names(which.max(x)) | |
})) | |
sp_p1 <- readRDS("data/P1_bin50_PFC.rds") | |
sp_p77 <- readRDS("data/P77_bin50_PFC.rds") | |
``` | |
# scRNAseq {scrolling="true"} | |
## {.sidebar} | |
```{r} | |
selectInput('dataset', 'Select dataset', c("All cells","Neurons"), selected = "Neurons") | |
``` | |
```{r} | |
selectInput('celltype', 'Select celltype', c("MainType","SubType"), selected = "SubType") | |
``` | |
```{r} | |
selectInput('gene', 'Select gene', rownames(seu.downsample), selected = "Cux2") | |
``` | |
## Column | |
### Row | |
#### Column | |
```{r} | |
plotOutput('cluster_plot') | |
``` | |
### Row | |
#### Column | |
```{r} | |
plotOutput('gene_plot') | |
``` | |
### Row | |
#### Column | |
```{r} | |
plotOutput('vln_plot') | |
``` | |
```{r} | |
#| context: server | |
output$cluster_plot <- renderPlot({ | |
if (input$dataset=="Neurons"){ | |
seu <- subset(seu.downsample, cells = colnames(seu.downsample)[seu.downsample$MainType==c("Excitatory", "Inhibitory")]) | |
}else{ | |
seu <- seu.downsample | |
} | |
seu@meta.data[,input$celltype] <- factor( | |
seu@meta.data[,input$celltype], | |
levels = names(col_cluster[[input$celltype]]) | |
) | |
DimPlot( | |
seu, | |
reduction = 'umap', | |
group.by = input$celltype, | |
split.by = "orig.ident", | |
ncol = 4, | |
cols = col_cluster[[input$celltype]], | |
pt.size = 0.5, | |
label = F) + | |
theme_bw(base_size = 15) + | |
theme(panel.grid = element_blank(), legend.position = "right", | |
strip.text = element_text(size = 20), | |
strip.background = element_rect(color="white", fill="white",)) + | |
coord_fixed() + | |
labs(title = "") + | |
guides(color = guide_legend(ncol = 1, override.aes = list(size = 3))) | |
}) | |
output$gene_plot <- renderPlot({ | |
if (input$dataset=="Neurons"){ | |
seu <- subset(seu.downsample, cells = colnames(seu.downsample)[seu.downsample$MainType==c("Excitatory", "Inhibitory")]) | |
}else{ | |
seu <- seu.downsample | |
} | |
FeaturePlot( | |
seu, | |
features = input$gene, | |
reduction = 'umap', | |
split.by = "orig.ident", | |
ncol=4, | |
order = T, | |
pt.size = 0.5 | |
) & | |
theme_bw(base_size = 15) & | |
theme(panel.grid = element_blank(), plot.title = element_text(hjust = 0.5), | |
strip.text = element_text(size = 20, face = "bold"), | |
legend.position = c(0.1,0.25)) & | |
coord_fixed() & | |
scale_color_gradientn(colours = c("lightblue3", "lightblue", "white", "red", "red4"), limits=c(0,2), breaks=c(0,2), na.value = "red4") | |
}) | |
output$vln_plot <- renderPlot({ | |
if (input$dataset=="Neurons"){ | |
seu <- subset(seu.downsample, cells = colnames(seu.downsample)[seu.downsample$MainType==c("Excitatory", "Inhibitory")]) | |
}else{ | |
seu <- seu.downsample | |
} | |
seu@meta.data[,input$celltype] <- factor( | |
seu@meta.data[,input$celltype], | |
levels = names(col_cluster[[input$celltype]]) | |
) | |
VlnPlot(seu, features = input$gene, group.by = input$celltype, | |
cols = col_cluster[[input$celltype]]) + | |
NoLegend() + | |
labs(x="") | |
}) | |
``` | |
# Spatial {scrolling="true"} | |
## {.sidebar} | |
```{r} | |
selectInput('sp_celltype', 'Select celltype', names(col_cluster[["SubType"]])[-18], selected = "Im L2/3 IT") | |
``` | |
```{r} | |
selectInput('sp_gene', 'Select gene', intersect(rownames(sp_p1), rownames(sp_p77)), selected = "Cux2") | |
``` | |
## Column | |
### Row | |
#### Column | |
```{r} | |
plotOutput('p1_cluster_plot') | |
``` | |
#### Column | |
```{r} | |
plotOutput('p77_cluster_plot') | |
``` | |
### Row | |
#### Column | |
```{r} | |
plotOutput('p1_subtype_plot') | |
``` | |
#### Column | |
```{r} | |
plotOutput('p1_geneplot') | |
``` | |
```{r} | |
#| context: server | |
output$p1_geneplot <- renderPlot({ | |
gene_i <- input$sp_gene | |
gene_i_exp <- as.numeric(FetchData(object = sp_p1, vars = gene_i, slot = "counts")[,1]) | |
data <- data.frame( | |
x = sp_p1$x_rotated, y = sp_p1$y_rotated, | |
gene = scale(gene_i_exp) | |
) | |
data$gene[data$gene<0] <- 0 | |
data$gene[data$gene>3] <- 3 | |
color <- col_cluster[["gene"]] | |
ggplot(data, aes(x=x, y=y, color=gene)) + | |
geom_point(size=2) + | |
scale_color_gradientn(colours = color, na.value = "lightgray", | |
limits = c(0,3), | |
breaks = c(0,3)) + | |
coord_fixed() + | |
theme_void()+ | |
theme(legend.position = c(0.9,0.2), legend.title = element_blank(), | |
plot.title = element_text(hjust = 0.5)) + | |
labs(title=paste("P1", gene_i)) | |
}) | |
``` | |
#### Column | |
```{r} | |
plotOutput('p77_subtype_plot') | |
``` | |
#### Column | |
```{r} | |
plotOutput('p77_geneplot') | |
``` | |
```{r} | |
#| context: server | |
output$p77_geneplot <- renderPlot({ | |
gene_i <- input$sp_gene | |
gene_i_exp <- as.numeric(FetchData(object = sp_p77, vars = gene_i, slot = "counts")[,1]) | |
data <- data.frame( | |
x = sp_p77$x_rotated, y = sp_p77$y_rotated, | |
gene = scale(gene_i_exp) | |
) | |
data$gene[data$gene<0] <- 0 | |
data$gene[data$gene>3] <- 3 | |
color <- col_cluster[["gene"]] | |
ggplot(data, aes(x=x, y=y, color=gene)) + | |
geom_point(size=0.8) + | |
scale_color_gradientn(colours = color, na.value = "lightgray", | |
limits = c(0,3), | |
breaks = c(0,3)) + | |
coord_fixed() + | |
theme_void() + | |
theme(legend.position = c(0.9,0.2), legend.title = element_blank(), | |
plot.title = element_text(hjust = 0.5)) + | |
labs(title=paste("P77", gene_i)) | |
}) | |
``` | |
```{r} | |
#| context: server | |
output$p1_cluster_plot <- renderPlot({ | |
data <- P1_cell2loc | |
ggplot(data, mapping = aes(x_rotated, y_rotated, color=SubType)) + | |
geom_point(size = 2) + | |
scale_color_manual(values = col_cluster[["SubType"]]) + | |
coord_fixed() + | |
#ggdark::dark_theme_void() + | |
theme_void() + | |
theme(legend.position = "right", plot.title = element_text(hjust = 0.5)) + | |
guides(color = guide_legend(title="", ncol = 1, override.aes = list(size = 3))) + | |
labs(title="P1 SubType") | |
}) | |
output$p77_cluster_plot <- renderPlot({ | |
data <- P77_cell2loc | |
ggplot(data, mapping = aes(x_rotated, y_rotated, color=SubType)) + | |
geom_point(size = 0.8) + | |
scale_color_manual(values = col_cluster[["SubType"]]) + | |
coord_fixed() + | |
#ggdark::dark_theme_void() + | |
theme_void() + | |
theme(legend.position = "right", plot.title = element_text(hjust = 0.5)) + | |
guides(color = guide_legend(title="", ncol = 1, override.aes = list(size = 3))) + | |
labs(title="P77 SubType") | |
}) | |
output$p1_subtype_plot <- renderPlot({ | |
data <- P1_cell2loc | |
subtype_i <- input$sp_celltype | |
df_i <- data.frame( | |
x = data$x_rotated, | |
y = data$y_rotated, | |
col = data[,subtype_i] | |
) | |
if (subtype_i %in% names(col_cluster[["SubType"]])[c(16,17,18,19,21)]){ | |
df_i$col[!data$SubType==subtype_i] <- 0 | |
} | |
df_i$col[df_i$col>1] <- 1 | |
df_i$col[df_i$col<0.05] <- 0 | |
low = "#f7f7f7" | |
if (length(which(df_i$col>0))==0){ | |
high = "#f7f7f7" | |
}else{ | |
high = col_cluster[["SubType"]][subtype_i] | |
} | |
ggplot(df_i, aes(x=x, y=y, color=col)) + | |
geom_point(size=2) + | |
scale_color_gradient(low = low, high=high, | |
na.value = "#f7f7f7", limits = c(0,max(df_i$col)), | |
breaks = c(0,max(df_i$col))) + | |
coord_fixed() + | |
theme_void() + | |
theme(legend.position = "none", | |
plot.title = element_text(hjust = 0.5)) + | |
labs(title=paste("P1", subtype_i)) | |
}) | |
output$p77_subtype_plot <- renderPlot({ | |
data <- P77_cell2loc | |
data$`L5 IT`[data$`L5 IT`<0.25] <- 0 | |
subtype_i <- input$sp_celltype | |
df_i <- data.frame( | |
x = data$x_rotated, | |
y = data$y_rotated, | |
col = data[,subtype_i] | |
) | |
if (subtype_i %in% names(col_cluster[["SubType"]])[c(16,17,18,20,21)]){ | |
df_i$col[!data$SubType==subtype_i] <- 0 | |
} | |
df_i$col[df_i$col>1] <- 1 | |
df_i$col[df_i$col<0.05] <- 0 | |
ggplot(df_i, aes(x=x, y=y, color=col)) + | |
geom_point(size=0.8) + | |
scale_color_gradient(low = "#f7f7f7", high=col_cluster[["SubType"]][subtype_i], | |
na.value = "#f7f7f7", limits = c(0,max(df_i$col)), | |
breaks = c(0,max(df_i$col))) + | |
coord_fixed() + | |
theme_void() + | |
theme(legend.position = "none", | |
plot.title = element_text(hjust = 0.5)) + | |
labs(title=paste("P77",subtype_i)) | |
}) | |
``` | |
# Download | |
<p style="font-size: 20px; text-align: justify;"> | |
The raw single cell RNA-seq data are available from GEO (<a href="https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE298260">GSE298260</a>). The raw stereo-seq data are available from GEO | |
</p> | |
<p style="font-size: 20px; text-align: justify;"> | |
The processed data can be downloaded here:</p> | |
- All cells data: <a href="https://huggingface.co/TigerZheng/PFCdev-data/resolve/main/seu.harmony.rds?download=true">sc_seu.rds</a> | |
- Spatial data: <a href="https://huggingface.co/TigerZheng/PFCdev-data/resolve/main/P1_bin50_PFC.rds?download=true">p1_seu.rds</a>, <a href="https://huggingface.co/TigerZheng/PFCdev-data/resolve/main/P77_bin50_PFC.rds?download=true">p77_seu.rds</a> | |