The Developing Mouse Visual Cortex Gene Expression Viewer is an interactive R Shiny application for exploring pseudobulk gene expression and the fraction of cells expressing each gene across developmental age, developmental stage, cell type, donor, library, and anatomical metadata. Users can identify candidate genes from a sortable statistics table, retrieve genes from public AWS storage, apply multiple simultaneous filters, create trajectory, heatmap, dot, violin or boxplot, and two-gene correlation views, and share configured analyses through bookmarked URLs.

The underlying resource is part of the Allen Brain Cell Atlas, an open-science platform for visualizing and analyzing multimodal single-cell data across the mammalian brain.

Launch the interactive viewer
Five plot types
Trajectory, heatmap, dot, violin, and two-gene correlation views.
Flexible filtering
Stack any number of categorical and numeric metadata filters.
Built-in statistics
Plot-specific tests follow the selected expression or fraction-expressing metric.
Lazy cloud access
Only requested gene partitions are read and cached.

Data

Scientific source

The viewer is based on the data resource associated with:

Gao, Y., van Velthoven, C. T. J., Lee, C., et al. Continuous cell-type diversification in mouse visual cortex development. Nature (2025). View the publication DOI.

Source documentation, notebooks, manifests, expression matrices, metadata, and taxonomy annotations are available through the Developing Mouse Visual Cortex dataset documentation and the ABC Atlas Access Python package.

Pseudobulk expression

The app uses a pseudobulk AnnData source generated from the raw Developing Mouse Visual Cortex single-cell count matrix. Raw counts were summed separately for each combination of library_label and cluster_alias. Each row is a library-by-cluster observation, each column is a gene, and each value in X is the summed raw count across contributing cells. A matching sparse number_of_cells_expressing layer records how many source cells have a raw count greater than zero for each gene and pseudobulk observation.

Gene-level Parquet files

The pseudobulk source was converted into a gene-partitioned Parquet resource. Each gene is stored under counts_by_gene/gene=<gene_key>/ with sample_id, summed_counts, and number_of_cells_expressing. The app opens only the selected partition and supports one or multiple Parquet files in that directory. If detection counts are unavailable in an older partition, expression views continue to work and the dot plot falls back to expression-based sizing.

Expression is displayed as counts per million (CPM):

CPM scaling factor = 1,000,000 / total counts across all genes in the pseudobulk observation
CPM for a selected gene = summed counts × CPM scaling factor

Users may display CPM or ln(CPM + 1), calculate the fraction of cells expressing a gene as number_of_cells_expressing / number_of_cells, and exclude zero-count observations. For grouped dot-plot values, fractions are weighted correctly by summing expressing-cell counts and total-cell counts before division.

Metadata and value sets

Values absent from value_sets.csv are retained and assigned distinct fallback colors.

AWS storage and access

The app anonymously reads lightweight metadata and statistics at startup and retrieves expression only for selected genes. No AWS credentials are required. Current test data are in the public TEST_dev_mouse S3 prefix.


Using the viewer

Left control panel

The left panel controls gene retrieval, stacked filtering, expression scaling, and plot configuration. Filter and plot controls appear after the first gene has loaded.

Gene

  1. Type a gene symbol or select a gene from the statistics table.
  2. Select Get gene data.
  3. The app reads the selected partition, joins counts to metadata by sample_id, calculates CPM, and stores the result in an in-memory cache.
  4. After selecting a gene, a button links to Plot in ABC Atlas.

The selector starts empty, displays an example gene, and does not require deleting a prefilled value.

Filter and scale

Plot controls


Application tabs

Select gene of interest

This tab contains a sortable table of gene-level exploratory statistics, including expression magnitude, developmental change, regional and subclass specificity, fraction-expressing summaries, and gene type. Numeric fields retain numeric sorting and range filters. Gene symbols link to GeneCards, and hovering over a defined column header displays its description.

Exact-value multi-select filters are provided below the table for gene_symbol, max_ROI, max_subclass, and gene_type. Selections within one field use OR; filters across fields use AND. Gene-symbol filtering uses the underlying plain symbol rather than the displayed GeneCards link. Selecting a table row places the gene into the Gene symbol control.

Important: Summary-table statistics are exploratory aids and are not substitutes for the analyses in the source study.

Plot gene of interest

The plotting tab supports five visualization types with matching plot-specific statistical summaries.

Trajectory across development

The trajectory plot displays expression or fraction expressing across an ordered progression variable. Developmental ages are biologically ordered; visual gaps are capped to compress large unsampled intervals while retaining endpoint padding.

Heatmap of mean expression

The heatmap displays mean expression or mean fraction expressing for every occupied combination of two dimensions.

Dot plot of mean expression

The dot plot uses the same two-dimensional grouping as the heatmap. Dot color represents mean expression, while dot area represents the weighted fraction of cells expressing the gene. Min. dot size and Max. dot size control the displayed size range without changing the underlying proportions; combinations with no data remain absent. The note below the plot reports separate sparse rook-neighbor Moran's I tests with 999 permutations for expression and fraction expressing.

Violin plot with observations

The distribution plot shows expression or fraction-expressing distributions across horizontal-axis groups and second-dimension facets.

Two-gene correlation

This plot compares two separately retrieved genes across matched sample_id values after applying active filters. The selected metric can be ln(CPM + 1) or fraction expressing.

Plot-specific exploratory statistics

Interpretation: These statistics describe the currently selected gene, filters, dimensions, and displayed observations. Interactive testing across many genes and configurations is exploratory and introduces multiple-comparison considerations beyond within-plot BH corrections.

Running the app

Most users should use the hosted viewer. The repository also supports local development and reproducible deployment.

Requirements

The app uses renv.lock to record tested package versions.

Local setup

  1. Clone the mouse-developing-vis-app repository.
  2. Open RStudio in code/shiny/.
  3. Restore dependencies from renv.lock.
install.packages("renv")
renv::restore()

Run the app

setwd("code/shiny")
shiny::runApp(".")

Repository structure

.
├── .github/workflows/deploy-connect.yml
├── code/
│   ├── data-preparation scripts
│   └── shiny/
│       ├── app.R
│       ├── table_column_definitions.csv
│       ├── renv.lock
│       └── www/
│           ├── Developing_Mouse_Visual_Cortex_logo.png
│           ├── allen_institute_logo.svg
│           └── tokens.csv
├── index.html
├── README.md
└── requirements.txt

Large expression files, pseudobulk sources, metadata, and gene statistics remain outside GitHub in external data assets and public AWS storage.


Citation

If you use the viewer or underlying data, cite the source study:

Gao, Y., van Velthoven, C. T. J., Lee, C., et al. Continuous cell-type diversification in mouse visual cortex development. Nature (2025). View the publication DOI.

Please also report the viewer version or Git commit and the public-data access date.


Feedback and support

Questions, bug reports, and suggestions are welcome. Open a GitHub issue or contact Jeremy Miller.

How the app was made

The Rebuilding and Deployment Guide documents the reproducible workflow used to prepare the pseudobulk and Parquet resources, publish data to AWS, run the Shiny app, deploy to Posit Connect, and configure automated deployment.

Acknowledgements

The underlying resource was generated through extensive experimental, computational, taxonomy, data-access, and publication efforts. We acknowledge the teams responsible for data generation, quality control, analysis, taxonomy construction, ABC Atlas Access, public cloud hosting, reproducible workflows, and application deployment.