Astrocyte cluster characterization

Cell-type genem markers

Published

March 18, 2026

Code
library(qs2)
library(Seurat)
library(patchwork)
library(tidyverse)
library(grid)
library(compareGroups)

source("20260217-helper_functions.R")

# Load reclustered astrocyte object (resolution 0.3, 11 clusters)
astro <- qs_read("seurat_objects/20260305-astro_0.3.qs2")

# Subset to clusters of interest: 0 and 1 (confirmed astrocytes), 7 (uncertain)
# astro_sub <- subset(astro, seurat_clusters %in% c(0, 1, 7))
astro_sub <- astro

### Dotplot decorations
dp_deco <- function() {list (
  coord_flip() ,
  theme(axis.text.x = element_text(size = 14),
        axis.text.y = element_text(size = 12, face = "italic"))
)}

Canonical marker genes

Astrocyte identity and reactive markers

Code
DefaultAssay(astro_sub) <- "SCT"

# Astrocyte identity markers
astro_markers <- c("Gfap", "Aqp4", "Aldh1l1",   "Aldoc" ,"Slc7a10") 
# LARA
lara_markers <- c("Gja1", "Cpe", "Ubc", "Tubb2b", "Atp1b2", "Ptgds",    "Ckb",  "Psap", "Scg3", "Htra1",    "Wif1")

astro <- DotPlot(astro_sub, features = astro_markers, group.by = "seurat_clusters") +
  labs(title = "Astrocyte identity markers") +
  dp_deco()


lara <- DotPlot(astro_sub, features = lara_markers, group.by = "seurat_clusters") +
  labs(title = "LARA identity markers") +
  dp_deco()

astro + lara

Code
# Reactive / inflammatory markers
reactive_markers <- c("Cxcl10", "Ccl2", "Vim", "Serpina3n", "Lcn2", "C3", "Tnf")
reactive_markers <- intersect(reactive_markers, rownames(astro_sub))

DotPlot(astro_sub, features = reactive_markers, group.by = "seurat_clusters") +
  labs(title = "Reactive / inflammatory markers") +
  dp_deco()

Other cell-type markers

Code
panneuron_markers <- c("Snap25","Grin2a","Grin2b")
microglia_markers <- c("Tmem119","Aif1", "Trem2", "P2ry12")
macro_marker <- c("Mgl2"    ,"Mrc1")
pericyte_markers <- c("Vtn",    "Kcnj8",    "Atp13a5")



## Dotplots of other markers
panneurons <- DotPlot(astro_sub, features = panneuron_markers, group.by = "seurat_clusters") +
  labs(title = "Pan-neuronal markers")+
  dp_deco()

microglia <- DotPlot(astro_sub, features = microglia_markers, group.by = "seurat_clusters") +
  labs(title = "Microglia markers") +
  dp_deco()

macrophages <- DotPlot(astro_sub, features = macro_marker, group.by = "seurat_clusters") +
  labs(title = "Macrophages markers") +
  dp_deco()

pericytes <- DotPlot(astro_sub, features = pericyte_markers, group.by = "seurat_clusters") +
  labs(title = "Pericytes markers") +
  dp_deco()


(panneurons + microglia) / (macrophages + pericytes)

Code
oligo_markers <- c("Ermn",  "Cldn11",   "Mog")
ependymal_markers <- c("Ccdc153",   "Dnah11",   "Tmem212")
endothelial_markers <-  c("Flt1","Emcn","Cldn5")
opc_markers <- c("Pdgfra",  "Tnr")


## Dotplots of other markers
oligo <- DotPlot(astro_sub, features = oligo_markers, group.by = "seurat_clusters") +
  labs(title = "Oligodendrocyte markers") +
  dp_deco()

ependymal <- DotPlot(astro_sub, features = ependymal_markers, group.by = "seurat_clusters") +
  labs(title = "Ependymal markers") +
  dp_deco()

endothelial <- DotPlot(astro_sub, features = endothelial_markers, group.by = "seurat_clusters") +
  labs(title = "Endothelial markers") +
  dp_deco()


opc <- DotPlot(astro_sub, features = opc_markers, group.by = "seurat_clusters") +
  labs(title = "OPC markers") +
  dp_deco()


(oligo + ependymal) / (endothelial + opc)

Proportions and brain region distribution

Cluster proportions per sample

Code
prop_res <- scProp(astro_sub,
                   cluster_col   = "seurat_clusters",
                   sample_col    = "sample_ID",
                   treatment_col = "Treatment.Group")

prop_res$counts_plot / prop_res$proportions_plot

Code
export2md(prop_res$summary_table)
Summary descriptives table by groups of `Treatment.Group'
Adu IgG p.overall
N=3 N=3
0 26.1 [25.7;27.6] 23.6 [22.2;29.1] 0.513
1 25.1 [23.6;27.2] 23.0 [20.8;24.1] 0.513
2 13.8 [13.7;14.9] 17.4 [15.9;17.8] 0.127
3 8.00 [7.10;8.30] 8.90 [7.85;8.95] 0.275
4 6.90 [6.20;7.35] 6.60 [5.80;8.05] 0.827
5 6.80 [6.40;7.25] 5.60 [5.40;6.60] 0.275
6 5.40 [4.75;5.80] 7.80 [6.50;8.05] 0.275
7 2.70 [2.50;2.85] 1.60 [1.30;2.30] 0.376
8 1.90 [1.85;1.90] 2.50 [2.05;2.70] 0.507
9 0.90 [0.80;1.90] 0.40 [0.40;1.60] 0.268
10 0.80 [0.70;1.00] 0.90 [0.85;1.00] 0.658

Cell counts by brain region

Code
# Cell counts per Region, faceted by cluster, dodged by treatment
astro_sub@meta.data |>
  filter(!is.na(Region)) |>
  count(seurat_clusters, Region, Treatment.Group) |>
  ggplot(aes(x = Region, y = n, fill = Treatment.Group)) +
  geom_col(position = "dodge", alpha = 0.85) +
  facet_wrap(~seurat_clusters, scales = "free_y", labeller = label_both, ncol = 3) +
  scale_fill_manual(values = c("Adu" = "#d73027", "IgG" = "#4575b4")) +
  labs(title = "Cell counts per brain region",
       y = "Number of cells", x = NULL, fill = NULL) +
  theme_minimal(base_size = 16) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1),
        panel.grid.major.x = element_blank(),
        strip.text = element_text(size = 14, face = "bold"))