--- 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

Spatiotemporal molecular and cellular dynamics of intratelencephalic neurons in mouse prefrontal cortex during postnatal development




Summary

In early postnatal brain, the prefrontal cortex (PFC) remains immature and highly plastic, particularly for the intratelencephalic (IT) neurons. However, the spatiotemporal molecular and cellular dynamics of PFC during this period remain poorly characterized. Here, we performed spatiotemporal single-cell RNA analysis on mouse PFC during different postnatal time points and systematically delineated the molecular and cellular dynamics of mouse PFC during early postnatal development, among which IT neurons exhibit most dramatic alterations. Based on these comprehensive spatiotemporal atlases of PFC, we deciphered the time-specific molecular and cellular characteristics during the maturation process of IT neurons in PFC, particularly the dynamic expression programs of genes regulating axon development and synaptic formation, and the risk genes of neurological developmental diseases. Furthermore, we revealed the dynamic neuron-glia interaction patterns and the underlying signaling pathways during early postnatal period. Our study provided a comprehensive resource and important insights for PFC development and PFC-associated neurological diseases.


Interactively exploring our data

scRNAseq

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:

- 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

Spatial data

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:

- Spatial Clustering: Select different cell subtypes to view their spatial distribution - Spatial Gene Expression: Select different genes to view their spatial expression

Download

Download the raw and processed data from this study.

```{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[seu.downsample$orig.ident == "P0"] <- "P1" seu.downsample$orig.ident <- factor(seu.downsample$orig.ident, levels = c("P1","P4","P10","Adult")) seu.downsample$SubType <- seu.downsample$SubType_v4 seu.downsample$SubType <- factor(seu.downsample$SubType, levels = names(col_cluster[["SubType"]])) seu.downsample$MainType <- factor(seu.downsample$MainType, levels = names(col_cluster[["MainType"]])) # 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 seu <- reactive({ if (input$dataset=="Neurons"){ subset(seu.downsample, cells = colnames(seu.downsample)[seu.downsample$MainType %in% c("Excitatory", "Inhibitory")]) }else{ seu.downsample } }) output$cluster_plot <- renderPlot({ 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({ 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({ data <- data.frame( Gene = as.numeric(seu()[["RNA"]]@data[input$gene, ]), Cluster = seu()@meta.data[,input$celltype] ) ggplot(data, aes(x=Cluster, y=Gene, fill=Cluster)) + geom_violin(scale = "width", adjust=1, trim=T) + geom_jitter(size=0.1) + scale_fill_manual(values = col_cluster[[input$celltype]]) + theme_classic(base_size = 15) + theme(legend.position = "none", plot.title = element_text(hjust = 0.5, size = 20, face = "bold.italic"), axis.text.x = element_text(angle = 45, hjust = 1)) + labs(x="", y="Expression Level", title = input$gene) }) ``` # 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

The raw single cell RNA-seq data are available from GEO (GSE298260). The raw stereo-seq data are available from GEO

The processed data can be downloaded here:

- All cells data: sc_seu.rds - Spatial data: p1_seu.rds, p77_seu.rds