PFCdev-web / PFCdevApp.qmd
TigerZheng's picture
Update PFCdevApp.qmd
34572d2 verified
---
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>