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 grammar —
DESeq2,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, soassay(),rowData(),colData(), and[all work as expected. - 📄 Reproducible reporting — export helpers plus a YAML-driven Quarto workflow.
Contents
Installation · Quick start · Why VISTA · Core workflow · Plot catalogue · Object design · Documentation · Citation
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 table3. 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")Plot catalogue
Quality control and sample structure
get_pca_plot() · get_mds_plot() · get_umap_plot() · get_corr_heatmap() · get_pairwise_corr_plot()
Differential expression summaries
get_volcano_plot() · get_ma_plot() · get_deg_count_barplot() · get_deg_count_pieplot() · get_deg_count_donutplot() · get_deg_venn_diagram() · get_deg_alluvial()
Expression patterns
get_expression_heatmap() · get_expression_boxplot() · get_expression_violinplot() · get_expression_barplot() · get_expression_lollipop() · get_expression_scatter() · get_expression_lineplot() · get_expression_density() · get_expression_joyplot() · get_expression_raincloud() · get_expression_chromosome_plot() · get_expression_matrix()
Fold-change structure
get_foldchange_scatter() · get_foldchange_barplot() · get_foldchange_lollipop() · get_foldchange_boxplot() · get_foldchange_lineplot() · get_foldchange_heatmap() · get_foldchange_matrix() · get_foldchange_chromosome_plot()
Pathway and enrichment
get_msigdb_enrichment() · get_go_enrichment() · get_kegg_enrichment() · get_gsea() · get_enrichment_plot() · get_enrichment_chord() · get_pathway_genes() · get_pathway_heatmap()
Deconvolution (optional)
run_cell_deconvolution() · get_celltype_barplot() · get_celltype_group_dotplot() · get_celltype_heatmap()
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_reportCitation
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()andR CMD check. - Update
NEWS.mdfor user-visible changes.
