Skip to contents

Visualization and Integrated System for Transcriptomic Analysis

VISTA is a Bioconductor framework for RNA-seq differential expression that keeps counts, statistics, annotations, and figures in a single validated SummarizedExperiment-based object — so you can go from raw counts to a publication-ready narrative without rebuilding the same glue code each project.

BiocManager::install("VISTA")
  • 📦 One object, one grammarDESeq2, edgeR, limma-voom, and a DESeq2/edgeR consensus behind a single entry point.
  • 🎨 40+ publication-ready plots — QC, differential expression, expression patterns, fold-change structure, enrichment, and deconvolution.
  • 🧬 Bioconductor-native — extends SummarizedExperiment, so assay(), rowData(), colData(), and [ all work as expected.
  • 📄 Reproducible reporting — export helpers plus a YAML-driven Quarto workflow.

Installation

Release — from Bioconductor:

if (!requireNamespace("BiocManager", quietly = TRUE)) {
  install.packages("BiocManager")
}

BiocManager::install("VISTA")

Development version (GitHub):

if (!requireNamespace("pak", quietly = TRUE)) {
  install.packages("pak")
}

pak::pak("cparsania/VISTA")

Quick start

library(VISTA)

data("count_data", package = "VISTA")        # gene-by-sample counts
data("sample_metadata", package = "VISTA")   # sample annotations

prepared_counts  <- read_vista_counts(count_data, format = "matrix", gene_id_column = "gene_id")
prepared_samples <- read_vista_metadata(sample_metadata)
matched_inputs   <- match_vista_inputs(prepared_counts, prepared_samples)

vista <- create_vista(
  counts          = matched_inputs$counts,
  sample_info     = matched_inputs$sample_info,
  column_geneid   = matched_inputs$column_geneid,
  group_column    = "cond_long",
  group_numerator = "treatment1",
  group_denominator = "control",
  method          = "deseq2",
  log2fc_cutoff   = 1,
  pval_cutoff     = 0.05
)

comp <- names(comparisons(vista))[1]

vista                                                    # object summary
head(comparisons(vista)[[comp]][, c("gene_id", "log2fc", "padj")])

Already have a SummarizedExperiment? Skip the import step:

vista <- as_vista(se, group_column = "cond_long")

Explore it

# Quality control
get_pca_plot(vista, label = TRUE)
get_mds_plot(vista, use_group_colors = TRUE)
get_corr_heatmap(vista)

# Differential expression
get_volcano_plot(vista, sample_comparison = comp)
get_ma_plot(vista, sample_comparison = comp)
get_deg_count_barplot(vista)

# Expression and fold-change views
up_genes <- get_genes_by_regulation(
  vista, sample_comparisons = comp, regulation = "Up", top_n = 40
)[[comp]]

get_expression_heatmap(vista, genes = up_genes, kmeans_k = 3)
get_expression_barplot(vista, genes = up_genes[1:3], by = "sample", facet_by = "gene")
get_foldchange_heatmap(vista)
get_foldchange_lollipop(vista, sample_comparison = comp, genes = up_genes[1:6], facet_by = "gene")

Why VISTA

Most RNA-seq projects repeat the same sequence: normalize counts, fit models, extract contrasts, plot QC, label genes, summarize pathways, assemble figures. The friction is rarely the statistics — it is the glue code between them.

VISTA organizes that work around one validated object:

Component Accessor
Normalized expression assay(x) / norm_counts(x)
Raw filtered counts counts(x)
Feature annotations rowData(x)
Sample metadata colData(x) / sample_info(x)
Differential expression tables comparisons(x)
Analysis parameters cutoffs(x)

Every accessor and plotting function reads that same object, so you move from raw counts to a consistent analysis narrative without switching data structures between steps.

Core workflow

1. Prepare counts and metadata

prepared_counts  <- read_vista_counts(count_data, format = "matrix", gene_id_column = "gene_id")
prepared_samples <- read_vista_metadata(sample_metadata)
matched_inputs   <- match_vista_inputs(prepared_counts, prepared_samples)

These helpers import plain matrices and data frames, featureCounts, STAR gene counts, HTSeq-count, tximport-like inputs, and RSEM gene results. No metadata sheet yet? Bootstrap one from the count sample names:

starter_metadata <- derive_vista_metadata(
  matched_inputs$counts,
  column_geneid = matched_inputs$column_geneid,
  parser = "auto"
)

2. Build the analysis object

vista <- create_vista(
  counts = matched_inputs$counts,
  sample_info = matched_inputs$sample_info,
  column_geneid = matched_inputs$column_geneid,
  group_column = "cond_long",
  group_numerator = "treatment1",
  group_denominator = "control",
  method = "limma"                       # or "deseq2", "edger", "both"
)

Use method = "both" for a DESeq2/edgeR consensus:

vista_consensus <- create_vista(
  ...,
  method = "both",
  result_source = "consensus"
)

vista_consensus <- set_de_source(vista_consensus, "edger")   # switch the active table

3. Adjust the model

# Sample-level covariates
vista_cov <- create_vista(..., covariates = "cell")

# Or a full design formula
vista_design <- create_vista(..., design_formula = ~ cell + cond_long)

4. Add feature annotations

vista <- set_rowdata(
  vista,
  orgdb = org.Hs.eg.db,
  columns = c("SYMBOL", "GENENAME", "ENTREZID")
)

5. Export and report

export_vista_assets(
  vista,
  out_dir = "vista_assets",
  include_data = c("comparison", "norm_counts", "sample_info")
)

file.copy(
  system.file("reports", "vista-report-template.yml", package = "VISTA"),
  "vista-report.yml"
)
run_vista_report("vista-report.yml")

Harmonized plot API

VISTA plotting functions share one argument grammar, so the same concept always uses the same name across plot families:

Argument Controls
sample_group, group_column Sample filtering and grouping
sample_comparison / sample_comparisons One contrast / several contrasts
genes, top_n Which features to show, and how many
by Group-level vs sample-level view
facet_by Layout by gene, group, comparison, or none
sample_order Sample sequencing for per-sample plots
display_id User-facing gene labels
summarise Collapse replicates to group means
color_by, palette, colors Colour control
return_type "plot", "data", or "both"

Older argument names keep working and warn with the release in which they become defunct — see ?"VISTA-deprecated".

Bioconductor-compatible object design

VISTA extends SummarizedExperiment, so standard Bioconductor workflows apply.

# Standard Bioconductor access
assay(vista)[1:5, 1:5]
rowData(vista)
colData(vista)
metadata(vista)
vista[1:100, ]                      # subsetting keeps DE tables aligned

# VISTA accessors
comparisons(vista)
deg_summary(vista)
cutoffs(vista)
norm_counts(vista, summarise = TRUE)

# Validation
validate_vista(vista, level = "full")

Raw filtered counts are retained alongside the normalized assay, so an object can go straight back into DESeq2:

counts(vista)                                     # integer counts
dds <- as_deseq_dataset(vista, design = ~ cond_long)

Note counts(), as_deseq_dataset(), and [ are available in the development version and are scheduled for the next Bioconductor release.

Example analyses

Enrichment from a comparison

msig <- get_msigdb_enrichment(
  vista, sample_comparison = comp, regulation = "Up",
  orgdb = org.Hs.eg.db, species = "Homo sapiens", msigdb_category = "H"
)

go_bp <- get_go_enrichment(
  vista, sample_comparison = comp, regulation = "Up",
  ont = "BP", orgdb = org.Hs.eg.db, species = "Homo sapiens"
)

get_enrichment_plot(msig$enrich)

Consistent colour control

group_colors(vista)

vista <- set_vista_group_colors(
  vista,
  c(control = "#264653", treatment1 = "#E76F51")
)

vista_consensus <- set_vista_comparison_colors(
  vista_consensus,
  c(treatment1_VS_control = "#6C5CE7")
)

Documentation

📖 Package website · Function reference

Workflows

Article Description
Complete RNA-seq workflow End-to-end analysis of the airway dataset
DESeq2 vs edgeR Comparing backends and building a consensus
Code economy VISTA against a standard R workflow
Cell-type deconvolution Optional deconvolution workflow

Visualization guides

Guide Description
Preparing counts and metadata Importing common count formats
Colour and palette design Consistent colours across comparisons
Enrichment chord diagrams Pathway–gene chord plots
Raincloud plots Distribution views
Function reference Narrative tour of the API

Local help works as usual:

?create_vista
?get_expression_heatmap
?get_go_enrichment
?run_vista_report

Citation

If you use VISTA in published work, cite the release used in your analysis:

citation("VISTA")
Parsania C (2026). VISTA: Visualization and Integrated System for Transcriptomic Analysis.
doi:10.18129/B9.bioc.VISTA, https://bioconductor.org/packages/VISTA/

Contributing

Contributions should preserve reproducibility and backward compatibility. Before opening a pull request:

  • Add or update tests for functional changes.
  • Run devtools::document() if roxygen comments changed.
  • Run devtools::test() and R CMD check.
  • Update NEWS.md for user-visible changes.

License

GPL-3