RESULT-CODE
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Datavzrd Figures Collection</title>
<style>
body { background-color: #f9f9f9; }
h1 { text-align: center; }
</style>
</head>
<body>
<h1>DATAVZRD FIGURES COLLECTION</h1>
<!-- FIGURES -->
<div class="figure">
<h2>Fig 1</h2>
<img src="https://journals.plos.org/...g001">
<div class="caption">Figure 1</div>
</div>
<div class="figure">
<h2>Fig 2</h2>
<img src="https://journals.plos.org/...g002">
<div class="caption">Figure 2</div>
</div>
<div class="figure">
<h2>Fig 3</h2>
<img src="https://journals.plos.org/...g003">
<div class="caption">
Example Datavzrd view of an astronomy spreadsheet supplement
</div>
</div>
<!-- ... continues up to Fig 11 ... -->
</body>
</html>
RAW TO BE EXTRACTED CODE:
Datavzrd_ Rapid programming- and maintenance-free interactive visualization and communication of tabular data _ PLOS One.html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:dc="http://purl.org/dc/terms/"
xmlns:doi="http://dx.doi.org/"
lang="en" xml:lang="en"
itemscope itemtype="http://schema.org/Article"
class="no-js">
<head prefix="og: http://ogp.me/ns#">
<link rel="stylesheet" href="/resource/css/screen.css?f8e55d20ecd3c26c3b153a24d09fd383"/>
<!-- allows for extra head tags -->
<!-- hello -->
<link rel="stylesheet" type="text/css"
href="https://fonts.googleapis.com/css?family=Open+Sans:400,400i,600">
<link media="print" rel="stylesheet" type="text/css" href="/resource/css/print.css"/>
<script type="text/javascript">
var siteUrlPrefix = "/plosone/";
</script>
<script src="/resource/js/vendor/modernizr-v2.7.1.js" type="text/javascript"></script>
<script src="/resource/js/vendor/detectizr.min.js" type="text/javascript"></script>
<link rel="shortcut icon" href="/resource/img/favicon.ico" type="image/x-icon"/>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<link rel="canonical" href="https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0323079" />
<meta name="description" content="Tabular data, often scattered across multiple tables, is the primary output of data analyses in virtually all scientific fields. Exchange and communication of tabular data is therefore a central challenge. We present Datavzrd, a tool for creating portable, visually rich, interactive reports from tabular data in any kind of scientific discipline. Datavzrd unifies the strengths of currently common generic approaches for interactive visualization like R Shiny with the portability, ease of use and sustainability of plain spreadsheets. The generated reports do not require the maintenance of a web server nor the installation of specialized software for viewing and can simply be attached to emails, shared via cloud services, or serve as manuscript supplements. They can be specified without requiring imperative programming, thereby enabling rapid development and offering accessibility for non-computational scientists, unlocking the look and feel of dedicated manually crafted web applications without the maintenance and development burden. Datavzrd reports scale from small tables to thousands or millions of rows and offer the ability to link multiple related tables, allowing to jump between corresponding rows or hierarchically explore growing levels of detail." />
<meta name="citation_abstract" content="Tabular data, often scattered across multiple tables, is the primary output of data analyses in virtually all scientific fields. Exchange and communication of tabular data is therefore a central challenge. We present Datavzrd, a tool for creating portable, visually rich, interactive reports from tabular data in any kind of scientific discipline. Datavzrd unifies the strengths of currently common generic approaches for interactive visualization like R Shiny with the portability, ease of use and sustainability of plain spreadsheets. The generated reports do not require the maintenance of a web server nor the installation of specialized software for viewing and can simply be attached to emails, shared via cloud services, or serve as manuscript supplements. They can be specified without requiring imperative programming, thereby enabling rapid development and offering accessibility for non-computational scientists, unlocking the look and feel of dedicated manually crafted web applications without the maintenance and development burden. Datavzrd reports scale from small tables to thousands or millions of rows and offer the ability to link multiple related tables, allowing to jump between corresponding rows or hierarchically explore growing levels of detail.">
<meta name="keywords" content="Data visualization,Programming languages,Reproducibility,Web-based applications,Genomics,Data compression,Genetic footprinting,Open source software" />
<meta name="citation_doi" content="10.1371/journal.pone.0323079"/>
<meta name="citation_author" content="Felix Wiegand"/>
<meta name="citation_author_institution" content="Bioinformatics and Computational Oncology, Institute for AI in Medicine (IKIM), University Hospital Essen, University of Duisburg-Essen, Essen, Germany"/>
<meta name="citation_author" content="David Lähnemann"/>
<meta name="citation_author_institution" content="Bioinformatics and Computational Oncology, Institute for AI in Medicine (IKIM), University Hospital Essen, University of Duisburg-Essen, Essen, Germany"/>
<meta name="citation_author_institution" content="German Cancer Consortium (DKTK), Partner Site Essen-Düsseldorf, A Partnership Between DKFZ and University Hospital Essen, Essen, Germany"/>
<meta name="citation_author" content="Felix Mölder"/>
<meta name="citation_author_institution" content="Bioinformatics and Computational Oncology, Institute for AI in Medicine (IKIM), University Hospital Essen, University of Duisburg-Essen, Essen, Germany"/>
<meta name="citation_author_institution" content="Institute of Pathology, University Hospital Essen, University of Duisburg-Essen, Essen, Germany"/>
<meta name="citation_author" content="Hamdiye Uzuner"/>
<meta name="citation_author_institution" content="Bioinformatics and Computational Oncology, Institute for AI in Medicine (IKIM), University Hospital Essen, University of Duisburg-Essen, Essen, Germany"/>
<meta name="citation_author" content="Adrian Prinz"/>
<meta name="citation_author_institution" content="Bioinformatics and Computational Oncology, Institute for AI in Medicine (IKIM), University Hospital Essen, University of Duisburg-Essen, Essen, Germany"/>
<meta name="citation_author" content="Alexander Schramm"/>
<meta name="citation_author_institution" content="Laboratory of Molecular Oncology, West German Cancer Center, Department of Medical Oncology, University Hospital Essen, Essen, Germany"/>
<meta name="citation_author" content="Johannes Köster"/>
<meta name="citation_author_institution" content="Bioinformatics and Computational Oncology, Institute for AI in Medicine (IKIM), University Hospital Essen, University of Duisburg-Essen, Essen, Germany"/>
<meta name="citation_title" content="Datavzrd: Rapid programming- and maintenance-free interactive visualization and communication of tabular data"/>
<meta itemprop="name" content="Datavzrd: Rapid programming- and maintenance-free interactive visualization and communication of tabular data"/>
<meta name="citation_journal_title" content="PLOS ONE"/>
<meta name="citation_journal_abbrev" content="PLOS ONE"/>
<meta name="citation_date" content="Jul 22, 2025"/>
<meta name="citation_firstpage" content="e0323079"/>
<meta name="citation_issue" content="7"/>
<meta name="citation_volume" content="20"/>
<meta name="citation_issn" content="1932-6203"/>
<meta name="citation_publisher" content="Public Library of Science"/>
<meta name="citation_pdf_url" content="https://journals.plos.org/plosone/article/file?id=10.1371/journal.pone.0323079&type=printable">
<meta name="citation_article_type" content="Research Article">
<meta name="dc.identifier" content="10.1371/journal.pone.0323079" />
<meta name="twitter:card" content="summary" />
<meta name="twitter:site" content="plosone"/>
<meta name="twitter:title" content="Datavzrd: Rapid programming- and maintenance-free interactive visualization and communication of tabular data" />
<meta property="twitter:description" content="Tabular data, often scattered across multiple tables, is the primary output of data analyses in virtually all scientific fields. Exchange and communication of tabular data is therefore a central challenge. We present Datavzrd, a tool for creating portable, visually rich, interactive reports from tabular data in any kind of scientific discipline. Datavzrd unifies the strengths of currently common generic approaches for interactive visualization like R Shiny with the portability, ease of use and sustainability of plain spreadsheets. The generated reports do not require the maintenance of a web server nor the installation of specialized software for viewing and can simply be attached to emails, shared via cloud services, or serve as manuscript supplements. They can be specified without requiring imperative programming, thereby enabling rapid development and offering accessibility for non-computational scientists, unlocking the look and feel of dedicated manually crafted web applications without the maintenance and development burden. Datavzrd reports scale from small tables to thousands or millions of rows and offer the ability to link multiple related tables, allowing to jump between corresponding rows or hierarchically explore growing levels of detail." />
<meta property="twitter:image" content="https://journals.plos.org/plosone/article/figure/image?id=10.1371/journal.pone.0323079.g011&size=inline" />
<meta property="og:type" content="article" />
<meta property="og:url" content="https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0323079"/>
<meta property="og:title" content="Datavzrd: Rapid programming- and maintenance-free interactive visualization and communication of tabular data"/>
<meta property="og:description" content="Tabular data, often scattered across multiple tables, is the primary output of data analyses in virtually all scientific fields. Exchange and communication of tabular data is therefore a central challenge. We present Datavzrd, a tool for creating portable, visually rich, interactive reports from tabular data in any kind of scientific discipline. Datavzrd unifies the strengths of currently common generic approaches for interactive visualization like R Shiny with the portability, ease of use and sustainability of plain spreadsheets. The generated reports do not require the maintenance of a web server nor the installation of specialized software for viewing and can simply be attached to emails, shared via cloud services, or serve as manuscript supplements. They can be specified without requiring imperative programming, thereby enabling rapid development and offering accessibility for non-computational scientists, unlocking the look and feel of dedicated manually crafted web applications without the maintenance and development burden. Datavzrd reports scale from small tables to thousands or millions of rows and offer the ability to link multiple related tables, allowing to jump between corresponding rows or hierarchically explore growing levels of detail."/>
<meta property="og:image" content="https://journals.plos.org/plosone/article/figure/image?id=10.1371/journal.pone.0323079.g011&size=inline"/>
<meta name="citation_reference" content="European Organization for Nuclear Research, OpenAIRE. Zenodo. 2013. https://www.zenodo.org/ "/>
<meta name="citation_reference" content="citation_title=MultiQC: summarize analysis results for multiple tools and samples in a single report;citation_author=P Ewels;citation_author=M Magnusson;citation_author=S Lundin;citation_author=M Käller;citation_journal_title=Bioinformatics.;citation_volume=32;citation_number=32;citation_issue=19;citation_first_page=3047;citation_last_page=8;citation_publication_date=2016;"/>
<meta name="citation_reference" content="citation_title=Vega-lite: a grammar of interactive graphics;citation_author=A Satyanarayan;citation_author=D Moritz;citation_author=K Wongsuphasawat;citation_author=J Heer;citation_journal_title=IEEE Trans Vis Comput Graph.;citation_volume=23;citation_number=23;citation_issue=1;citation_first_page=341;citation_last_page=50;citation_publication_date=2017;"/>
<meta name="citation_reference" content="citation_title=Gene name errors: lessons not learned;citation_author=M Abeysooriya;citation_author=M Soria;citation_author=MS Kasu;citation_author=M Ziemann;citation_journal_title=PLoS Comput Biol.;citation_volume=17;citation_number=17;citation_issue=7;citation_publication_date=2021;"/>
<meta name="citation_reference" content="citation_title=Sustainable data analysis with Snakemake;citation_author=F Mölder;citation_author=KP Jablonski;citation_author=B Letcher;citation_author=MB Hall;citation_author=CH Tomkins-Tinch;citation_author=V Sochat;citation_journal_title=F1000Res.;citation_volume=10;citation_number=10;citation_first_page=33;citation_publication_date=2021;"/>
<meta name="citation_reference" content="citation_title=Data organization in spreadsheets;citation_author=KW Broman;citation_author=KH Woo;citation_journal_title=Am Statist.;citation_volume=72;citation_number=72;citation_issue=1;citation_first_page=2;citation_last_page=10;citation_publication_date=2018;"/>
<meta name="citation_reference" content="citation_title=Gene name errors are widespread in the scientific literature;citation_author=M Ziemann;citation_author=Y Eren;citation_author=A El-Osta;citation_journal_title=Genome Biol.;citation_volume=17;citation_number=17;citation_issue=1;citation_first_page=177;citation_publication_date=2016;"/>
<meta name="citation_reference" content="Petty D, Thompson J. The not-so-same-origin policy: bypassing web security through server misconfiguration. Independent Security Evaluators; 2017. https://www.ise.io/wp-content/uploads/2018/03/ise_same-origin-policy_whitepaper.pdf "/>
<meta name="citation_reference" content="citation_title=Shiny: Web Application Framework for R;citation_author=W Chang;citation_author=J Cheng;citation_author=J Allaire;citation_author=C Sievert;citation_author=B Schloerke;citation_author=Y Xie;citation_journal_title=Shiny: Web Application Framework for R;citation_publication_date=2024;"/>
<meta name="citation_reference" content="citation_title=Effective use of tables and figures in abstracts, presentations, and papers;citation_author=CG Jr Durbin;citation_journal_title=Respir Care.;citation_volume=49;citation_number=49;citation_issue=10;citation_first_page=1233;citation_last_page=7;citation_publication_date=2004;"/>
<meta name="citation_reference" content="citation_title=Utilizing tables, figures, charts and graphs to enhance the readability of a research paper;citation_author=CA Divecha;citation_author=MS Tullu;citation_author=S Karande;citation_journal_title=J Postgrad Med.;citation_volume=69;citation_number=69;citation_issue=3;citation_first_page=125;citation_last_page=31;citation_publication_date=2023;"/>
<meta name="citation_reference" content="citation_title=Preparing effective tables;citation_author=KH Ng;citation_author=WC Peh;citation_journal_title=Singapore Med J.;citation_volume=50;citation_number=50;citation_issue=2;citation_first_page=117;citation_last_page=8;citation_publication_date=2009;"/>
<meta name="citation_reference" content="Gruber J. Markdown: syntax. 2012. https://daringfireball.net/projects/markdown/syntax "/>
<meta name="citation_reference" content="citation_title=VarFish: comprehensive DNA variant analysis for diagnostics and research;citation_author=M Holtgrewe;citation_author=O Stolpe;citation_author=M Nieminen;citation_author=S Mundlos;citation_author=A Knaus;citation_author=U Kornak;citation_journal_title=Nucleic Acids Res.;citation_volume=48;citation_number=48;citation_last_page=9;citation_publication_date=2020;"/>
<meta name="citation_reference" content="citation_title=The cBio cancer genomics portal: an open platform for exploring multidimensional cancer genomics data;citation_author=E Cerami;citation_author=J Gao;citation_author=U Dogrusoz;citation_author=BE Gross;citation_author=SO Sumer;citation_author=BA Aksoy;citation_journal_title=Cancer Discov.;citation_volume=2;citation_number=2;citation_issue=5;citation_first_page=401;citation_last_page=4;citation_publication_date=2012;"/>
<meta name="citation_reference" content="citation_title=Integrative analysis of complex cancer genomics and clinical profiles using the cBioPortal;citation_author=J Gao;citation_author=BA Aksoy;citation_author=U Dogrusoz;citation_author=G Dresdner;citation_author=B Gross;citation_author=SO Sumer;citation_journal_title=Sci Signal.;citation_volume=6;citation_number=6;citation_issue=269;citation_publication_date=2013;"/>
<meta name="citation_reference" content="citation_title=Integrative analysis of complex cancer genomics and clinical profiles using the cBioPortal;citation_author=J Gao;citation_author=BA Aksoy;citation_author=U Dogrusoz;citation_author=G Dresdner;citation_author=B Gross;citation_author=SO Sumer;citation_journal_title=Sci Signal.;citation_volume=6;citation_number=6;citation_issue=269;citation_publication_date=2013;"/>
<meta name="citation_reference" content="citation_title=A multi-analytical study of the Montelirio beaded attires: marine resources, sumptuary crafts, and female power in copper age Iberia;citation_author=LG Sanjuán;citation_author=S Ramírez-Cruzado;citation_author=M Díaz-Guardamino;citation_author=JAL Rodríguez;citation_author=TD Romero;citation_author=JÁA Vargas;citation_journal_title=Sci Adv.;citation_volume=11;citation_number=11;citation_issue=5;citation_publication_date=2025;"/>
<meta name="citation_reference" content="citation_title=Mapping cells through time and space with moscot;citation_author=D Klein;citation_author=G Palla;citation_author=M Lange;citation_author=M Klein;citation_author=Z Piran;citation_author=M Gander;citation_journal_title=Nature.;citation_volume=638;citation_number=638;citation_issue=8052;citation_first_page=1065;citation_last_page=75;citation_publication_date=2025;"/>
<meta name="citation_reference" content="citation_title=Estrategias silvopastoriles para mitigar efectos del cambio climático en sistemas ganaderos del sur de México;citation_author=J Alayón-Gamboa;citation_author=G Jimenez-Ferrer;citation_author=J Nahed Toral;citation_author=VL G;citation_journal_title=Agro Productividad.;citation_volume=9;citation_number=9;citation_first_page=10;citation_last_page=5;citation_publication_date=2016;"/>
<meta name="citation_reference" content="citation_title=Near-ultraviolet to near-infrared spectral properties of hollows on mercury: implications for origin and formation process;citation_author=O Barraud;citation_author=A Doressoundiram;citation_author=S Besse;citation_author=JM Sunshine;citation_journal_title=JGR Planets.;citation_volume=125;citation_number=125;citation_issue=12;citation_publication_date=2020;"/>
<meta name="citation_reference" content="citation_title=Integrative genomics viewer;citation_author=JT Robinson;citation_author=H Thorvaldsdóttir;citation_author=W Winckler;citation_author=M Guttman;citation_author=ES Lander;citation_author=G Getz;citation_journal_title=Nat Biotechnol.;citation_volume=29;citation_number=29;citation_issue=1;citation_first_page=24;citation_last_page=6;citation_publication_date=2011;"/>
<meta name="citation_reference" content="citation_title=Nextflow enables reproducible computational workflows;citation_author=P Di Tommaso;citation_author=M Chatzou;citation_author=EW Floden;citation_author=PP Barja;citation_author=E Palumbo;citation_author=C Notredame;citation_journal_title=Nat Biotechnol.;citation_volume=35;citation_number=35;citation_issue=4;citation_first_page=316;citation_last_page=9;citation_publication_date=2017;"/>
<meta name="citation_reference" content="citation_title=Common workflow language, v1.0;citation_author=P Amstutz;citation_author=MR Crusoe;citation_author=N Tijanić;citation_author=B Chapman;citation_author=J Chilton;citation_author=M Heuer;citation_publication_date=2016;"/>
<meta name="citation_reference" content="citation_title=great-tables: make awesome display tables using Python;citation_author=R Iannone;citation_author=C Michael;citation_journal_title=great-tables: make awesome display tables using Python;"/>
<meta name="citation_reference" content="Posit Software P. ShinyApps.io. https://www.shinyapps.io "/>
<meta name="citation_reference" content="citation_title=A data and analytics web app framework for Python, no JavaScript required;citation_author=C Parmer;citation_author=P Duval;citation_author=A Johnson;citation_journal_title=A data and analytics web app framework for Python, no JavaScript required;citation_publication_date=2024;"/>
<meta name="citation_reference" content="HoloViz. Lumen. https://lumen.holoviz.org "/>
<meta name="citation_reference" content="Observable. D3.js—Data-driven documents. https://d3js.org "/>
<meta name="citation_reference" content="Plotly. 2023. https://plotly.com "/>
<meta name="citation_reference" content="The Rust Team. The Rust Programming Language. https://www.rust-lang.org "/>
<meta name="citation_reference" content="Datavzrd. Datavzrd on GitHub. https://github.com/datavzrd/datavzrd "/>
<meta name="citation_reference" content="crates.io. Datavzrd on crates.io. https://crates.io/crates/datavzrd "/>
<meta name="citation_reference" content="Conda-Forge. Datavzrd on Anaconda (conda-forge). https://anaconda.org/conda-forge/datavzrd ."/>
<meta name="citation_reference" content="Team S. Datavzrd Snakemake Wrapper. https://snakemake-wrappers.readthedocs.io/en/stable/wrappers/datavzrd.html "/>
<meta name="citation_reference" content="Apache Parquet. https://parquet.apache.org "/>
<meta name="citation_reference" content="HTML Living Standard. https://html.spec.whatwg.org "/>
<meta name="citation_reference" content="GitHub Pages. https://pages.github.com "/>
<meta name="citation_reference" content="YTE Template Engine. 2023 . https://yte-template-engine.github.io "/>
<meta name="citation_reference" content="Datavzrd Spells Repository. https://github.com/datavzrd/datavzrd-spells "/>
<meta name="citation_reference" content="Datavzrd Spells Documentation. https://datavzrd.github.io/docs/spells.html "/>
<meta name="citation_reference" content="Datavzrd Example Report: Moscot (Bioinformatics). https://datavzrd.github.io/example-report-moscot/ "/>
<meta name="citation_reference" content="Datavzrd Example Report: Diversity in Human-Wildlife (Social Science). 2023. https://datavzrd.github.io/example-report-diversity-in-human-wildlife/ "/>
<meta name="citation_reference" content="Datavzrd Example Report: Spatial Pattern Analysis. https://datavzrd.github.io/example-report-spatial-pattern-analysis/ "/>
<meta name="citation_reference" content="Datavzrd Example Report: Beaded Attires Study. https://datavzrd.github.io/example-report-beaded-attires-study/ "/>
<meta name="citation_reference" content="Datavzrd Benchmark Repository. https://github.com/koesterlab/datavzrd-benchmark "/>
<meta name="citation_reference" content="Electric Vehicle Population Data. https://catalog.data.gov/dataset/electric-vehicle-population-data "/>
<meta name="citation_reference" content="HDF5 - Hierarchical Data Format. https://www.hdfgroup.org/solutions/hdf5/ "/>
<meta name="citation_reference" content="Raasveldt M, Muehleisen H. DuckDB. https://github.com/duckdb/duckdb "/>
<meta name="citation_reference" content="FlatBuffers. https://flatbuffers.dev "/>
<meta name="citation_reference" content="SQLite. https://sqlite.org/ "/>
<meta name="citation_reference" content="C L. JSONM: json compressor for packing messages with memoization;. https://github.com/lennartcl/jsonm "/>
<meta name="citation_reference" content="Lz-string: JavaScript compression, fast! https://pieroxy.net/blog/pages/lz-string/index.html "/>
<meta name="citation_reference" content="Web Components Community Group. Web Components Community Group. https://github.com/WICG/webcomponents "/>
<meta name="citation_reference" content="Datavzrd Spell Catalog – Boolean Spell. https://datavzrd.github.io/docs/spells.html#boolean "/>
<script type="text/javascript">
var WombatConfig = WombatConfig || {};
WombatConfig.journalKey = "PLoSONE";
WombatConfig.journalName = "PLOS One";
WombatConfig.figurePath = "/plosone/article/figure/image";
WombatConfig.figShareInstitutionString = "plos";
WombatConfig.doiResolverPrefix = "https://dx.plos.org/";
</script>
<script type="text/javascript">
var WombatConfig = WombatConfig || {};
WombatConfig.metrics = WombatConfig.metrics || {};
WombatConfig.metrics.referenceUrl = "http://lagotto.io/plos";
WombatConfig.metrics.googleScholarUrl = "https://scholar.google.com/scholar";
WombatConfig.metrics.googleScholarCitationUrl = WombatConfig.metrics.googleScholarUrl + "?hl=en&lr=&q=";
WombatConfig.metrics.crossrefUrl = "https://www.crossref.org";
</script>
<script defer="defer" src="/resource/js/defer.js?1f3e0d6251fa3735e30e"></script><script src="/resource/js/sync.js?1f3e0d6251fa3735e30e"></script>
<script src="/resource/js/vendor/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript" src="https://widgets.figshare.com/static/figshare.js"></script>
<script src="/resource/js/vendor/fastclick/lib/fastclick.js" type="text/javascript"></script>
<script src="/resource/js/vendor/foundation/foundation.js" type="text/javascript"></script>
<script src="/resource/js/vendor/underscore-min.js" type="text/javascript"></script>
<script src="/resource/js/vendor/underscore.string.min.js" type="text/javascript"></script>
<script src="/resource/js/vendor/moment.js" type="text/javascript"></script>
<script src="/resource/js/vendor/jquery-ui-effects.min.js" type="text/javascript"></script>
<script src="/resource/js/vendor/foundation/foundation.tooltip.js" type="text/javascript"></script>
<script src="/resource/js/vendor/foundation/foundation.dropdown.js" type="text/javascript"></script>
<script src="/resource/js/vendor/foundation/foundation.tab.js" type="text/javascript"></script>
<script src="/resource/js/vendor/foundation/foundation.reveal.js" type="text/javascript"></script>
<script src="/resource/js/vendor/foundation/foundation.slider.js" type="text/javascript"></script>
<script src="/resource/js/util/utils.js" type="text/javascript"></script>
<script src="/resource/js/components/toggle.js" type="text/javascript"></script>
<script src="/resource/js/components/truncate_elem.js" type="text/javascript"></script>
<script src="/resource/js/components/tooltip_hover.js" type="text/javascript"></script>
<script src="/resource/js/vendor/jquery.dotdotdot.js" type="text/javascript"></script>
<!-- DoubleClick overall ad setup script -->
<script type='text/javascript'>
var googletag = googletag || {};
googletag.cmd = googletag.cmd || [];
if (window.plosCookieConsent?.hasConsented('advertising')) {
(function() {
var gads = document.createElement('script');
gads.async = true;
gads.type = 'text/javascript';
var useSSL = 'https:' == document.location.protocol;
gads.src = (useSSL ? 'https:' : 'http:') +
'//www.googletagservices.com/tag/js/gpt.js';
var node = document.getElementsByTagName('script')[0];
node.parentNode.insertBefore(gads, node);
})();
}
</script>
<!-- DoubleClick ad slot setup script -->
<script id="doubleClickSetupScript" type='text/javascript'>
googletag.cmd.push(function() {
googletag.defineSlot('/75507958/PONE_728x90_ATF', [728, 90], 'div-gpt-ad-1458247671871-0').addService(googletag.pubads());
googletag.defineSlot('/75507958/PONE_160x600_BTF', [160, 600], 'div-gpt-ad-1458247671871-1').addService(googletag.pubads());
googletag.pubads().enableSingleRequest();
googletag.enableServices();
});
</script>
<!--For Google Tag manager to be able to track site information -->
<script>
dataLayer = [{
'mobileSite': 'false',
'desktopSite': 'true'
}];
</script>
<title>Datavzrd: Rapid programming- and maintenance-free interactive visualization and communication of tabular data | PLOS One</title>
</head>
<body class="article plosone">
<!-- Google Tag Manager -->
<noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-TP26BH"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<script>
(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-TP26BH');
</script>
<noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-MQQMGF"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-MQQMGF');</script>
<!-- End Google Tag Manager -->
<!-- Start of HubSpot Embed Code -->
<script>
// from https://developers.hubspot.com/docs/reference/api/analytics-and-events/cookie-banner/cookie-banner-api#example-using-a-third-party-cookie-banner-to-control-hubspot-cookies
window.disableHubSpotCookieBanner = true;
window._hsp = window._hsp || [];
window._hsp.push(['setHubSpotConsent',
{
analytics: window.plosCookieConsent?.hasConsented('analytics'),
advertisement: window.plosCookieConsent?.hasConsented('advertising'),
functionality: window.plosCookieConsent?.hasConsented('functionality')
}
]);
</script>
<script type="text/javascript" id="hs-script-loader" async defer src="//js.hs-scripts.com/44092021.js"></script>
<!-- End of HubSpot Embed Code -->
<!-- New Relic -->
<script type="text/javascript">
;window.NREUM||(NREUM={});NREUM.init={distributed_tracing:{enabled:true},privacy:{cookies_enabled:true},ajax:{deny_list:["bam.nr-data.net"]}};
window.NREUM||(NREUM={}),__nr_require=function(t,e,n){function r(n){if(!e[n]){var o=e[n]={exports:{}};t[n][0].call(o.exports,function(e){var o=t[n][1][e];return r(o||e)},o,o.exports)}return e[n].exports}if("function"==typeof __nr_require)return __nr_require;for(var o=0;o<n.length;o++)r(n[o]);return r}({1:[function(t,e,n){function r(t){try{s.console&&console.log(t)}catch(e){}}var o,i=t("ee"),a=t(32),s={};try{o=localStorage.getItem("__nr_flags").split(","),console&&"function"==typeof console.log&&(s.console=!0,o.indexOf("dev")!==-1&&(s.dev=!0),o.indexOf("nr_dev")!==-1&&(s.nrDev=!0))}catch(c){}s.nrDev&&i.on("internal-error",function(t){r(t.stack)}),s.dev&&i.on("fn-err",function(t,e,n){r(n.stack)}),s.dev&&(r("NR AGENT IN DEVELOPMENT MODE"),r("flags: "+a(s,function(t,e){return t}).join(", ")))},{}],2:[function(t,e,n){function r(t,e,n,r,s){try{l?l-=1:o(s||new UncaughtException(t,e,n),!0)}catch(f){try{i("ierr",[f,c.now(),!0])}catch(d){}}return"function"==typeof u&&u.apply(this,a(arguments))}function UncaughtException(t,e,n){this.message=t||"Uncaught error with no additional information",this.sourceURL=e,this.line=n}function o(t,e){var n=e?null:c.now();i("err",[t,n])}var i=t("handle"),a=t(33),s=t("ee"),c=t("loader"),f=t("gos"),u=window.onerror,d=!1,p="nr@seenError";if(!c.disabled){var l=0;c.features.err=!0,t(1),window.onerror=r;try{throw new Error}catch(h){"stack"in h&&(t(14),t(13),"addEventListener"in window&&t(7),c.xhrWrappable&&t(15),d=!0)}s.on("fn-start",function(t,e,n){d&&(l+=1)}),s.on("fn-err",function(t,e,n){d&&!n[p]&&(f(n,p,function(){return!0}),this.thrown=!0,o(n))}),s.on("fn-end",function(){d&&!this.thrown&&l>0&&(l-=1)}),s.on("internal-error",function(t){i("ierr",[t,c.now(),!0])})}},{}],3:[function(t,e,n){var r=t("loader");r.disabled||(r.features.ins=!0)},{}],4:[function(t,e,n){function r(){U++,L=g.hash,this[u]=y.now()}function o(){U--,g.hash!==L&&i(0,!0);var t=y.now();this[h]=~~this[h]+t-this[u],this[d]=t}function i(t,e){E.emit("newURL",[""+g,e])}function a(t,e){t.on(e,function(){this[e]=y.now()})}var s="-start",c="-end",f="-body",u="fn"+s,d="fn"+c,p="cb"+s,l="cb"+c,h="jsTime",m="fetch",v="addEventListener",w=window,g=w.location,y=t("loader");if(w[v]&&y.xhrWrappable&&!y.disabled){var x=t(11),b=t(12),E=t(9),R=t(7),O=t(14),T=t(8),P=t(15),S=t(10),M=t("ee"),N=M.get("tracer"),C=t(23);t(17),y.features.spa=!0;var L,U=0;M.on(u,r),b.on(p,r),S.on(p,r),M.on(d,o),b.on(l,o),S.on(l,o),M.buffer([u,d,"xhr-resolved"]),R.buffer([u]),O.buffer(["setTimeout"+c,"clearTimeout"+s,u]),P.buffer([u,"new-xhr","send-xhr"+s]),T.buffer([m+s,m+"-done",m+f+s,m+f+c]),E.buffer(["newURL"]),x.buffer([u]),b.buffer(["propagate",p,l,"executor-err","resolve"+s]),N.buffer([u,"no-"+u]),S.buffer(["new-jsonp","cb-start","jsonp-error","jsonp-end"]),a(T,m+s),a(T,m+"-done"),a(S,"new-jsonp"),a(S,"jsonp-end"),a(S,"cb-start"),E.on("pushState-end",i),E.on("replaceState-end",i),w[v]("hashchange",i,C(!0)),w[v]("load",i,C(!0)),w[v]("popstate",function(){i(0,U>1)},C(!0))}},{}],5:[function(t,e,n){function r(){var t=new PerformanceObserver(function(t,e){var n=t.getEntries();s(v,[n])});try{t.observe({entryTypes:["resource"]})}catch(e){}}function o(t){if(s(v,[window.performance.getEntriesByType(w)]),window.performance["c"+p])try{window.performance[h](m,o,!1)}catch(t){}else try{window.performance[h]("webkit"+m,o,!1)}catch(t){}}function i(t){}if(window.performance&&window.performance.timing&&window.performance.getEntriesByType){var a=t("ee"),s=t("handle"),c=t(14),f=t(13),u=t(6),d=t(23),p="learResourceTimings",l="addEventListener",h="removeEventListener",m="resourcetimingbufferfull",v="bstResource",w="resource",g="-start",y="-end",x="fn"+g,b="fn"+y,E="bstTimer",R="pushState",O=t("loader");if(!O.disabled){O.features.stn=!0,t(9),"addEventListener"in window&&t(7);var T=NREUM.o.EV;a.on(x,function(t,e){var n=t[0];n instanceof T&&(this.bstStart=O.now())}),a.on(b,function(t,e){var n=t[0];n instanceof T&&s("bst",[n,e,this.bstStart,O.now()])}),c.on(x,function(t,e,n){this.bstStart=O.now(),this.bstType=n}),c.on(b,function(t,e){s(E,[e,this.bstStart,O.now(),this.bstType])}),f.on(x,function(){this.bstStart=O.now()}),f.on(b,function(t,e){s(E,[e,this.bstStart,O.now(),"requestAnimationFrame"])}),a.on(R+g,function(t){this.time=O.now(),this.startPath=location.pathname+location.hash}),a.on(R+y,function(t){s("bstHist",[location.pathname+location.hash,this.startPath,this.time])}),u()?(s(v,[window.performance.getEntriesByType("resource")]),r()):l in window.performance&&(window.performance["c"+p]?window.performance[l](m,o,d(!1)):window.performance[l]("webkit"+m,o,d(!1))),document[l]("scroll",i,d(!1)),document[l]("keypress",i,d(!1)),document[l]("click",i,d(!1))}}},{}],6:[function(t,e,n){e.exports=function(){return"PerformanceObserver"in window&&"function"==typeof window.PerformanceObserver}},{}],7:[function(t,e,n){function r(t){for(var e=t;e&&!e.hasOwnProperty(u);)e=Object.getPrototypeOf(e);e&&o(e)}function o(t){s.inPlace(t,[u,d],"-",i)}function i(t,e){return t[1]}var a=t("ee").get("events"),s=t("wrap-function")(a,!0),c=t("gos"),f=XMLHttpRequest,u="addEventListener",d="removeEventListener";e.exports=a,"getPrototypeOf"in Object?(r(document),r(window),r(f.prototype)):f.prototype.hasOwnProperty(u)&&(o(window),o(f.prototype)),a.on(u+"-start",function(t,e){var n=t[1];if(null!==n&&("function"==typeof n||"object"==typeof n)){var r=c(n,"nr@wrapped",function(){function t(){if("function"==typeof n.handleEvent)return n.handleEvent.apply(n,arguments)}var e={object:t,"function":n}[typeof n];return e?s(e,"fn-",null,e.name||"anonymous"):n});this.wrapped=t[1]=r}}),a.on(d+"-start",function(t){t[1]=this.wrapped||t[1]})},{}],8:[function(t,e,n){function r(t,e,n){var r=t[e];"function"==typeof r&&(t[e]=function(){var t=i(arguments),e={};o.emit(n+"before-start",[t],e);var a;e[m]&&e[m].dt&&(a=e[m].dt);var s=r.apply(this,t);return o.emit(n+"start",[t,a],s),s.then(function(t){return o.emit(n+"end",[null,t],s),t},function(t){throw o.emit(n+"end",[t],s),t})})}var o=t("ee").get("fetch"),i=t(33),a=t(32);e.exports=o;var s=window,c="fetch-",f=c+"body-",u=["arrayBuffer","blob","json","text","formData"],d=s.Request,p=s.Response,l=s.fetch,h="prototype",m="nr@context";d&&p&&l&&(a(u,function(t,e){r(d[h],e,f),r(p[h],e,f)}),r(s,"fetch",c),o.on(c+"end",function(t,e){var n=this;if(e){var r=e.headers.get("content-length");null!==r&&(n.rxSize=r),o.emit(c+"done",[null,e],n)}else o.emit(c+"done",[t],n)}))},{}],9:[function(t,e,n){var r=t("ee").get("history"),o=t("wrap-function")(r);e.exports=r;var i=window.history&&window.history.constructor&&window.history.constructor.prototype,a=window.history;i&&i.pushState&&i.replaceState&&(a=i),o.inPlace(a,["pushState","replaceState"],"-")},{}],10:[function(t,e,n){function r(t){function e(){f.emit("jsonp-end",[],l),t.removeEventListener("load",e,c(!1)),t.removeEventListener("error",n,c(!1))}function n(){f.emit("jsonp-error",[],l),f.emit("jsonp-end",[],l),t.removeEventListener("load",e,c(!1)),t.removeEventListener("error",n,c(!1))}var r=t&&"string"==typeof t.nodeName&&"script"===t.nodeName.toLowerCase();if(r){var o="function"==typeof t.addEventListener;if(o){var a=i(t.src);if(a){var d=s(a),p="function"==typeof d.parent[d.key];if(p){var l={};u.inPlace(d.parent,[d.key],"cb-",l),t.addEventListener("load",e,c(!1)),t.addEventListener("error",n,c(!1)),f.emit("new-jsonp",[t.src],l)}}}}}function o(){return"addEventListener"in window}function i(t){var e=t.match(d);return e?e[1]:null}function a(t,e){var n=t.match(l),r=n[1],o=n[3];return o?a(o,e[r]):e[r]}function s(t){var e=t.match(p);return e&&e.length>=3?{key:e[2],parent:a(e[1],window)}:{key:t,parent:window}}var c=t(23),f=t("ee").get("jsonp"),u=t("wrap-function")(f);if(e.exports=f,o()){var d=/[?&](?:callback|cb)=([^&#]+)/,p=/(.*)\.([^.]+)/,l=/^(\w+)(\.|$)(.*)$/,h=["appendChild","insertBefore","replaceChild"];Node&&Node.prototype&&Node.prototype.appendChild?u.inPlace(Node.prototype,h,"dom-"):(u.inPlace(HTMLElement.prototype,h,"dom-"),u.inPlace(HTMLHeadElement.prototype,h,"dom-"),u.inPlace(HTMLBodyElement.prototype,h,"dom-")),f.on("dom-start",function(t){r(t[0])})}},{}],11:[function(t,e,n){var r=t("ee").get("mutation"),o=t("wrap-function")(r),i=NREUM.o.MO;e.exports=r,i&&(window.MutationObserver=function(t){return this instanceof i?new i(o(t,"fn-")):i.apply(this,arguments)},MutationObserver.prototype=i.prototype)},{}],12:[function(t,e,n){function r(t){var e=i.context(),n=s(t,"executor-",e,null,!1),r=new f(n);return i.context(r).getCtx=function(){return e},r}var o=t("wrap-function"),i=t("ee").get("promise"),a=t("ee").getOrSetContext,s=o(i),c=t(32),f=NREUM.o.PR;e.exports=i,f&&(window.Promise=r,["all","race"].forEach(function(t){var e=f[t];f[t]=function(n){function r(t){return function(){i.emit("propagate",[null,!o],a,!1,!1),o=o||!t}}var o=!1;c(n,function(e,n){Promise.resolve(n).then(r("all"===t),r(!1))});var a=e.apply(f,arguments),s=f.resolve(a);return s}}),["resolve","reject"].forEach(function(t){var e=f[t];f[t]=function(t){var n=e.apply(f,arguments);return t!==n&&i.emit("propagate",[t,!0],n,!1,!1),n}}),f.prototype["catch"]=function(t){return this.then(null,t)},f.prototype=Object.create(f.prototype,{constructor:{value:r}}),c(Object.getOwnPropertyNames(f),function(t,e){try{r[e]=f[e]}catch(n){}}),o.wrapInPlace(f.prototype,"then",function(t){return function(){var e=this,n=o.argsToArray.apply(this,arguments),r=a(e);r.promise=e,n[0]=s(n[0],"cb-",r,null,!1),n[1]=s(n[1],"cb-",r,null,!1);var c=t.apply(this,n);return r.nextPromise=c,i.emit("propagate",[e,!0],c,!1,!1),c}}),i.on("executor-start",function(t){t[0]=s(t[0],"resolve-",this,null,!1),t[1]=s(t[1],"resolve-",this,null,!1)}),i.on("executor-err",function(t,e,n){t[1](n)}),i.on("cb-end",function(t,e,n){i.emit("propagate",[n,!0],this.nextPromise,!1,!1)}),i.on("propagate",function(t,e,n){this.getCtx&&!e||(this.getCtx=function(){if(t instanceof Promise)var e=i.context(t);return e&&e.getCtx?e.getCtx():this})}),r.toString=function(){return""+f})},{}],13:[function(t,e,n){var r=t("ee").get("raf"),o=t("wrap-function")(r),i="equestAnimationFrame";e.exports=r,o.inPlace(window,["r"+i,"mozR"+i,"webkitR"+i,"msR"+i],"raf-"),r.on("raf-start",function(t){t[0]=o(t[0],"fn-")})},{}],14:[function(t,e,n){function r(t,e,n){t[0]=a(t[0],"fn-",null,n)}function o(t,e,n){this.method=n,this.timerDuration=isNaN(t[1])?0:+t[1],t[0]=a(t[0],"fn-",this,n)}var i=t("ee").get("timer"),a=t("wrap-function")(i),s="setTimeout",c="setInterval",f="clearTimeout",u="-start",d="-";e.exports=i,a.inPlace(window,[s,"setImmediate"],s+d),a.inPlace(window,[c],c+d),a.inPlace(window,[f,"clearImmediate"],f+d),i.on(c+u,r),i.on(s+u,o)},{}],15:[function(t,e,n){function r(t,e){d.inPlace(e,["onreadystatechange"],"fn-",s)}function o(){var t=this,e=u.context(t);t.readyState>3&&!e.resolved&&(e.resolved=!0,u.emit("xhr-resolved",[],t)),d.inPlace(t,y,"fn-",s)}function i(t){x.push(t),m&&(E?E.then(a):w?w(a):(R=-R,O.data=R))}function a(){for(var t=0;t<x.length;t++)r([],x[t]);x.length&&(x=[])}function s(t,e){return e}function c(t,e){for(var n in t)e[n]=t[n];return e}t(7);var f=t("ee"),u=f.get("xhr"),d=t("wrap-function")(u),p=t(23),l=NREUM.o,h=l.XHR,m=l.MO,v=l.PR,w=l.SI,g="readystatechange",y=["onload","onerror","onabort","onloadstart","onloadend","onprogress","ontimeout"],x=[];e.exports=u;var b=window.XMLHttpRequest=function(t){var e=new h(t);try{u.emit("new-xhr",[e],e),e.addEventListener(g,o,p(!1))}catch(n){try{u.emit("internal-error",[n])}catch(r){}}return e};if(c(h,b),b.prototype=h.prototype,d.inPlace(b.prototype,["open","send"],"-xhr-",s),u.on("send-xhr-start",function(t,e){r(t,e),i(e)}),u.on("open-xhr-start",r),m){var E=v&&v.resolve();if(!w&&!v){var R=1,O=document.createTextNode(R);new m(a).observe(O,{characterData:!0})}}else f.on("fn-end",function(t){t[0]&&t[0].type===g||a()})},{}],16:[function(t,e,n){function r(t){if(!s(t))return null;var e=window.NREUM;if(!e.loader_config)return null;var n=(e.loader_config.accountID||"").toString()||null,r=(e.loader_config.agentID||"").toString()||null,f=(e.loader_config.trustKey||"").toString()||null;if(!n||!r)return null;var h=l.generateSpanId(),m=l.generateTraceId(),v=Date.now(),w={spanId:h,traceId:m,timestamp:v};return(t.sameOrigin||c(t)&&p())&&(w.traceContextParentHeader=o(h,m),w.traceContextStateHeader=i(h,v,n,r,f)),(t.sameOrigin&&!u()||!t.sameOrigin&&c(t)&&d())&&(w.newrelicHeader=a(h,m,v,n,r,f)),w}function o(t,e){return"00-"+e+"-"+t+"-01"}function i(t,e,n,r,o){var i=0,a="",s=1,c="",f="";return o+"@nr="+i+"-"+s+"-"+n+"-"+r+"-"+t+"-"+a+"-"+c+"-"+f+"-"+e}function a(t,e,n,r,o,i){var a="btoa"in window&&"function"==typeof window.btoa;if(!a)return null;var s={v:[0,1],d:{ty:"Browser",ac:r,ap:o,id:t,tr:e,ti:n}};return i&&r!==i&&(s.d.tk=i),btoa(JSON.stringify(s))}function s(t){return f()&&c(t)}function c(t){var e=!1,n={};if("init"in NREUM&&"distributed_tracing"in NREUM.init&&(n=NREUM.init.distributed_tracing),t.sameOrigin)e=!0;else if(n.allowed_origins instanceof Array)for(var r=0;r<n.allowed_origins.length;r++){var o=h(n.allowed_origins[r]);if(t.hostname===o.hostname&&t.protocol===o.protocol&&t.port===o.port){e=!0;break}}return e}function f(){return"init"in NREUM&&"distributed_tracing"in NREUM.init&&!!NREUM.init.distributed_tracing.enabled}function u(){return"init"in NREUM&&"distributed_tracing"in NREUM.init&&!!NREUM.init.distributed_tracing.exclude_newrelic_header}function d(){return"init"in NREUM&&"distributed_tracing"in NREUM.init&&NREUM.init.distributed_tracing.cors_use_newrelic_header!==!1}function p(){return"init"in NREUM&&"distributed_tracing"in NREUM.init&&!!NREUM.init.distributed_tracing.cors_use_tracecontext_headers}var l=t(29),h=t(18);e.exports={generateTracePayload:r,shouldGenerateTrace:s}},{}],17:[function(t,e,n){function r(t){var e=this.params,n=this.metrics;if(!this.ended){this.ended=!0;for(var r=0;r<p;r++)t.removeEventListener(d[r],this.listener,!1);e.aborted||(n.duration=a.now()-this.startTime,this.loadCaptureCalled||4!==t.readyState?null==e.status&&(e.status=0):i(this,t),n.cbTime=this.cbTime,s("xhr",[e,n,this.startTime,this.endTime,"xhr"],this))}}function o(t,e){var n=c(e),r=t.params;r.hostname=n.hostname,r.port=n.port,r.protocol=n.protocol,r.host=n.hostname+":"+n.port,r.pathname=n.pathname,t.parsedOrigin=n,t.sameOrigin=n.sameOrigin}function i(t,e){t.params.status=e.status;var n=v(e,t.lastSize);if(n&&(t.metrics.rxSize=n),t.sameOrigin){var r=e.getResponseHeader("X-NewRelic-App-Data");r&&(t.params.cat=r.split(", ").pop())}t.loadCaptureCalled=!0}var a=t("loader");if(a.xhrWrappable&&!a.disabled){var s=t("handle"),c=t(18),f=t(16).generateTracePayload,u=t("ee"),d=["load","error","abort","timeout"],p=d.length,l=t("id"),h=t(24),m=t(22),v=t(19),w=t(23),g=NREUM.o.REQ,y=window.XMLHttpRequest;a.features.xhr=!0,t(15),t(8),u.on("new-xhr",function(t){var e=this;e.totalCbs=0,e.called=0,e.cbTime=0,e.end=r,e.ended=!1,e.xhrGuids={},e.lastSize=null,e.loadCaptureCalled=!1,e.params=this.params||{},e.metrics=this.metrics||{},t.addEventListener("load",function(n){i(e,t)},w(!1)),h&&(h>34||h<10)||t.addEventListener("progress",function(t){e.lastSize=t.loaded},w(!1))}),u.on("open-xhr-start",function(t){this.params={method:t[0]},o(this,t[1]),this.metrics={}}),u.on("open-xhr-end",function(t,e){"loader_config"in NREUM&&"xpid"in NREUM.loader_config&&this.sameOrigin&&e.setRequestHeader("X-NewRelic-ID",NREUM.loader_config.xpid);var n=f(this.parsedOrigin);if(n){var r=!1;n.newrelicHeader&&(e.setRequestHeader("newrelic",n.newrelicHeader),r=!0),n.traceContextParentHeader&&(e.setRequestHeader("traceparent",n.traceContextParentHeader),n.traceContextStateHeader&&e.setRequestHeader("tracestate",n.traceContextStateHeader),r=!0),r&&(this.dt=n)}}),u.on("send-xhr-start",function(t,e){var n=this.metrics,r=t[0],o=this;if(n&&r){var i=m(r);i&&(n.txSize=i)}this.startTime=a.now(),this.listener=function(t){try{"abort"!==t.type||o.loadCaptureCalled||(o.params.aborted=!0),("load"!==t.type||o.called===o.totalCbs&&(o.onloadCalled||"function"!=typeof e.onload))&&o.end(e)}catch(n){try{u.emit("internal-error",[n])}catch(r){}}};for(var s=0;s<p;s++)e.addEventListener(d[s],this.listener,w(!1))}),u.on("xhr-cb-time",function(t,e,n){this.cbTime+=t,e?this.onloadCalled=!0:this.called+=1,this.called!==this.totalCbs||!this.onloadCalled&&"function"==typeof n.onload||this.end(n)}),u.on("xhr-load-added",function(t,e){var n=""+l(t)+!!e;this.xhrGuids&&!this.xhrGuids[n]&&(this.xhrGuids[n]=!0,this.totalCbs+=1)}),u.on("xhr-load-removed",function(t,e){var n=""+l(t)+!!e;this.xhrGuids&&this.xhrGuids[n]&&(delete this.xhrGuids[n],this.totalCbs-=1)}),u.on("xhr-resolved",function(){this.endTime=a.now()}),u.on("addEventListener-end",function(t,e){e instanceof y&&"load"===t[0]&&u.emit("xhr-load-added",[t[1],t[2]],e)}),u.on("removeEventListener-end",function(t,e){e instanceof y&&"load"===t[0]&&u.emit("xhr-load-removed",[t[1],t[2]],e)}),u.on("fn-start",function(t,e,n){e instanceof y&&("onload"===n&&(this.onload=!0),("load"===(t[0]&&t[0].type)||this.onload)&&(this.xhrCbStart=a.now()))}),u.on("fn-end",function(t,e){this.xhrCbStart&&u.emit("xhr-cb-time",[a.now()-this.xhrCbStart,this.onload,e],e)}),u.on("fetch-before-start",function(t){function e(t,e){var n=!1;return e.newrelicHeader&&(t.set("newrelic",e.newrelicHeader),n=!0),e.traceContextParentHeader&&(t.set("traceparent",e.traceContextParentHeader),e.traceContextStateHeader&&t.set("tracestate",e.traceContextStateHeader),n=!0),n}var n,r=t[1]||{};"string"==typeof t[0]?n=t[0]:t[0]&&t[0].url?n=t[0].url:window.URL&&t[0]&&t[0]instanceof URL&&(n=t[0].href),n&&(this.parsedOrigin=c(n),this.sameOrigin=this.parsedOrigin.sameOrigin);var o=f(this.parsedOrigin);if(o&&(o.newrelicHeader||o.traceContextParentHeader))if("string"==typeof t[0]||window.URL&&t[0]&&t[0]instanceof URL){var i={};for(var a in r)i[a]=r[a];i.headers=new Headers(r.headers||{}),e(i.headers,o)&&(this.dt=o),t.length>1?t[1]=i:t.push(i)}else t[0]&&t[0].headers&&e(t[0].headers,o)&&(this.dt=o)}),u.on("fetch-start",function(t,e){this.params={},this.metrics={},this.startTime=a.now(),this.dt=e,t.length>=1&&(this.target=t[0]),t.length>=2&&(this.opts=t[1]);var n,r=this.opts||{},i=this.target;"string"==typeof i?n=i:"object"==typeof i&&i instanceof g?n=i.url:window.URL&&"object"==typeof i&&i instanceof URL&&(n=i.href),o(this,n);var s=(""+(i&&i instanceof g&&i.method||r.method||"GET")).toUpperCase();this.params.method=s,this.txSize=m(r.body)||0}),u.on("fetch-done",function(t,e){this.endTime=a.now(),this.params||(this.params={}),this.params.status=e?e.status:0;var n;"string"==typeof this.rxSize&&this.rxSize.length>0&&(n=+this.rxSize);var r={txSize:this.txSize,rxSize:n,duration:a.now()-this.startTime};s("xhr",[this.params,r,this.startTime,this.endTime,"fetch"],this)})}},{}],18:[function(t,e,n){var r={};e.exports=function(t){if(t in r)return r[t];var e=document.createElement("a"),n=window.location,o={};e.href=t,o.port=e.port;var i=e.href.split("://");!o.port&&i[1]&&(o.port=i[1].split("/")[0].split("@").pop().split(":")[1]),o.port&&"0"!==o.port||(o.port="https"===i[0]?"443":"80"),o.hostname=e.hostname||n.hostname,o.pathname=e.pathname,o.protocol=i[0],"/"!==o.pathname.charAt(0)&&(o.pathname="/"+o.pathname);var a=!e.protocol||":"===e.protocol||e.protocol===n.protocol,s=e.hostname===document.domain&&e.port===n.port;return o.sameOrigin=a&&(!e.hostname||s),"/"===o.pathname&&(r[t]=o),o}},{}],19:[function(t,e,n){function r(t,e){var n=t.responseType;return"json"===n&&null!==e?e:"arraybuffer"===n||"blob"===n||"json"===n?o(t.response):"text"===n||""===n||void 0===n?o(t.responseText):void 0}var o=t(22);e.exports=r},{}],20:[function(t,e,n){function r(){}function o(t,e,n,r){return function(){return u.recordSupportability("API/"+e+"/called"),i(t+e,[f.now()].concat(s(arguments)),n?null:this,r),n?void 0:this}}var i=t("handle"),a=t(32),s=t(33),c=t("ee").get("tracer"),f=t("loader"),u=t(25),d=NREUM;"undefined"==typeof window.newrelic&&(newrelic=d);var p=["setPageViewName","setCustomAttribute","setErrorHandler","finished","addToTrace","inlineHit","addRelease"],l="api-",h=l+"ixn-";a(p,function(t,e){d[e]=o(l,e,!0,"api")}),d.addPageAction=o(l,"addPageAction",!0),d.setCurrentRouteName=o(l,"routeName",!0),e.exports=newrelic,d.interaction=function(){return(new r).get()};var m=r.prototype={createTracer:function(t,e){var n={},r=this,o="function"==typeof e;return i(h+"tracer",[f.now(),t,n],r),function(){if(c.emit((o?"":"no-")+"fn-start",[f.now(),r,o],n),o)try{return e.apply(this,arguments)}catch(t){throw c.emit("fn-err",[arguments,this,t],n),t}finally{c.emit("fn-end",[f.now()],n)}}}};a("actionText,setName,setAttribute,save,ignore,onEnd,getContext,end,get".split(","),function(t,e){m[e]=o(h,e)}),newrelic.noticeError=function(t,e){"string"==typeof t&&(t=new Error(t)),u.recordSupportability("API/noticeError/called"),i("err",[t,f.now(),!1,e])}},{}],21:[function(t,e,n){function r(t){if(NREUM.init){for(var e=NREUM.init,n=t.split("."),r=0;r<n.length-1;r++)if(e=e[n[r]],"object"!=typeof e)return;return e=e[n[n.length-1]]}}e.exports={getConfiguration:r}},{}],22:[function(t,e,n){e.exports=function(t){if("string"==typeof t&&t.length)return t.length;if("object"==typeof t){if("undefined"!=typeof ArrayBuffer&&t instanceof ArrayBuffer&&t.byteLength)return t.byteLength;if("undefined"!=typeof Blob&&t instanceof Blob&&t.size)return t.size;if(!("undefined"!=typeof FormData&&t instanceof FormData))try{return JSON.stringify(t).length}catch(e){return}}}},{}],23:[function(t,e,n){var r=!1;try{var o=Object.defineProperty({},"passive",{get:function(){r=!0}});window.addEventListener("testPassive",null,o),window.removeEventListener("testPassive",null,o)}catch(i){}e.exports=function(t){return r?{passive:!0,capture:!!t}:!!t}},{}],24:[function(t,e,n){var r=0,o=navigator.userAgent.match(/Firefox[\/\s](\d+\.\d+)/);o&&(r=+o[1]),e.exports=r},{}],25:[function(t,e,n){function r(t,e){var n=[a,t,{name:t},e];return i("storeMetric",n,null,"api"),n}function o(t,e){var n=[s,t,{name:t},e];return i("storeEventMetrics",n,null,"api"),n}var i=t("handle"),a="sm",s="cm";e.exports={constants:{SUPPORTABILITY_METRIC:a,CUSTOM_METRIC:s},recordSupportability:r,recordCustom:o}},{}],26:[function(t,e,n){function r(){return s.exists&&performance.now?Math.round(performance.now()):(i=Math.max((new Date).getTime(),i))-a}function o(){return i}var i=(new Date).getTime(),a=i,s=t(34);e.exports=r,e.exports.offset=a,e.exports.getLastTimestamp=o},{}],27:[function(t,e,n){function r(t){return!(!t||!t.protocol||"file:"===t.protocol)}e.exports=r},{}],28:[function(t,e,n){function r(t,e){var n=t.getEntries();n.forEach(function(t){"first-paint"===t.name?p("timing",["fp",Math.floor(t.startTime)]):"first-contentful-paint"===t.name&&p("timing",["fcp",Math.floor(t.startTime)])})}function o(t,e){var n=t.getEntries();if(n.length>0){var r=n[n.length-1];if(c&&c<r.startTime)return;p("lcp",[r])}}function i(t){t.getEntries().forEach(function(t){t.hadRecentInput||p("cls",[t])})}function a(t){if(t instanceof v&&!g){var e=Math.round(t.timeStamp),n={type:t.type};e<=l.now()?n.fid=l.now()-e:e>l.offset&&e<=Date.now()?(e-=l.offset,n.fid=l.now()-e):e=l.now(),g=!0,p("timing",["fi",e,n])}}function s(t){"hidden"===t&&(c=l.now(),p("pageHide",[c]))}if(!("init"in NREUM&&"page_view_timing"in NREUM.init&&"enabled"in NREUM.init.page_view_timing&&NREUM.init.page_view_timing.enabled===!1)){var c,f,u,d,p=t("handle"),l=t("loader"),h=t(31),m=t(23),v=NREUM.o.EV;if("PerformanceObserver"in window&&"function"==typeof window.PerformanceObserver){f=new PerformanceObserver(r);try{f.observe({entryTypes:["paint"]})}catch(w){}u=new PerformanceObserver(o);try{u.observe({entryTypes:["largest-contentful-paint"]})}catch(w){}d=new PerformanceObserver(i);try{d.observe({type:"layout-shift",buffered:!0})}catch(w){}}if("addEventListener"in document){var g=!1,y=["click","keydown","mousedown","pointerdown","touchstart"];y.forEach(function(t){document.addEventListener(t,a,m(!1))})}h(s)}},{}],29:[function(t,e,n){function r(){function t(){return e?15&e[n++]:16*Math.random()|0}var e=null,n=0,r=window.crypto||window.msCrypto;r&&r.getRandomValues&&(e=r.getRandomValues(new Uint8Array(31)));for(var o,i="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx",a="",s=0;s<i.length;s++)o=i[s],"x"===o?a+=t().toString(16):"y"===o?(o=3&t()|8,a+=o.toString(16)):a+=o;return a}function o(){return a(16)}function i(){return a(32)}function a(t){function e(){return n?15&n[r++]:16*Math.random()|0}var n=null,r=0,o=window.crypto||window.msCrypto;o&&o.getRandomValues&&Uint8Array&&(n=o.getRandomValues(new Uint8Array(31)));for(var i=[],a=0;a<t;a++)i.push(e().toString(16));return i.join("")}e.exports={generateUuid:r,generateSpanId:o,generateTraceId:i}},{}],30:[function(t,e,n){function r(t,e){if(!o)return!1;if(t!==o)return!1;if(!e)return!0;if(!i)return!1;for(var n=i.split("."),r=e.split("."),a=0;a<r.length;a++)if(r[a]!==n[a])return!1;return!0}var o=null,i=null,a=/Version\/(\S+)\s+Safari/;if(navigator.userAgent){var s=navigator.userAgent,c=s.match(a);c&&s.indexOf("Chrome")===-1&&s.indexOf("Chromium")===-1&&(o="Safari",i=c[1])}e.exports={agent:o,version:i,match:r}},{}],31:[function(t,e,n){function r(t){function e(){t(s&&document[s]?document[s]:document[i]?"hidden":"visible")}"addEventListener"in document&&a&&document.addEventListener(a,e,o(!1))}var o=t(23);e.exports=r;var i,a,s;"undefined"!=typeof document.hidden?(i="hidden",a="visibilitychange",s="visibilityState"):"undefined"!=typeof document.msHidden?(i="msHidden",a="msvisibilitychange"):"undefined"!=typeof document.webkitHidden&&(i="webkitHidden",a="webkitvisibilitychange",s="webkitVisibilityState")},{}],32:[function(t,e,n){function r(t,e){var n=[],r="",i=0;for(r in t)o.call(t,r)&&(n[i]=e(r,t[r]),i+=1);return n}var o=Object.prototype.hasOwnProperty;e.exports=r},{}],33:[function(t,e,n){function r(t,e,n){e||(e=0),"undefined"==typeof n&&(n=t?t.length:0);for(var r=-1,o=n-e||0,i=Array(o<0?0:o);++r<o;)i[r]=t[e+r];return i}e.exports=r},{}],34:[function(t,e,n){e.exports={exists:"undefined"!=typeof window.performance&&window.performance.timing&&"undefined"!=typeof window.performance.timing.navigationStart}},{}],ee:[function(t,e,n){function r(){}function o(t){function e(t){return t&&t instanceof r?t:t?f(t,c,a):a()}function n(n,r,o,i,a){if(a!==!1&&(a=!0),!l.aborted||i){t&&a&&t(n,r,o);for(var s=e(o),c=m(n),f=c.length,u=0;u<f;u++)c[u].apply(s,r);var p=d[y[n]];return p&&p.push([x,n,r,s]),s}}function i(t,e){g[t]=m(t).concat(e)}function h(t,e){var n=g[t];if(n)for(var r=0;r<n.length;r++)n[r]===e&&n.splice(r,1)}function m(t){return g[t]||[]}function v(t){return p[t]=p[t]||o(n)}function w(t,e){l.aborted||u(t,function(t,n){e=e||"feature",y[n]=e,e in d||(d[e]=[])})}var g={},y={},x={on:i,addEventListener:i,removeEventListener:h,emit:n,get:v,listeners:m,context:e,buffer:w,abort:s,aborted:!1};return x}function i(t){return f(t,c,a)}function a(){return new r}function s(){(d.api||d.feature)&&(l.aborted=!0,d=l.backlog={})}var c="nr@context",f=t("gos"),u=t(32),d={},p={},l=e.exports=o();e.exports.getOrSetContext=i,l.backlog=d},{}],gos:[function(t,e,n){function r(t,e,n){if(o.call(t,e))return t[e];var r=n();if(Object.defineProperty&&Object.keys)try{return Object.defineProperty(t,e,{value:r,writable:!0,enumerable:!1}),r}catch(i){}return t[e]=r,r}var o=Object.prototype.hasOwnProperty;e.exports=r},{}],handle:[function(t,e,n){function r(t,e,n,r){o.buffer([t],r),o.emit(t,e,n)}var o=t("ee").get("handle");e.exports=r,r.ee=o},{}],id:[function(t,e,n){function r(t){var e=typeof t;return!t||"object"!==e&&"function"!==e?-1:t===window?0:a(t,i,function(){return o++})}var o=1,i="nr@id",a=t("gos");e.exports=r},{}],loader:[function(t,e,n){function r(){if(!P++){var t=T.info=NREUM.info,e=v.getElementsByTagName("script")[0];if(setTimeout(f.abort,3e4),!(t&&t.licenseKey&&t.applicationID&&e))return f.abort();c(R,function(e,n){t[e]||(t[e]=n)});var n=a();s("mark",["onload",n+T.offset],null,"api"),s("timing",["load",n]);var r=v.createElement("script");0===t.agent.indexOf("http://")||0===t.agent.indexOf("https://")?r.src=t.agent:r.src=h+"://"+t.agent,e.parentNode.insertBefore(r,e)}}function o(){"complete"===v.readyState&&i()}function i(){s("mark",["domContent",a()+T.offset],null,"api")}var a=t(26),s=t("handle"),c=t(32),f=t("ee"),u=t(30),d=t(27),p=t(21),l=t(23),h=p.getConfiguration("ssl")===!1?"http":"https",m=window,v=m.document,w="addEventListener",g="attachEvent",y=m.XMLHttpRequest,x=y&&y.prototype,b=!d(m.location);NREUM.o={ST:setTimeout,SI:m.setImmediate,CT:clearTimeout,XHR:y,REQ:m.Request,EV:m.Event,PR:m.Promise,MO:m.MutationObserver};var E=""+location,R={beacon:"bam.nr-data.net",errorBeacon:"bam.nr-data.net",agent:"js-agent.newrelic.com/nr-spa-1212.min.js"},O=y&&x&&x[w]&&!/CriOS/.test(navigator.userAgent),T=e.exports={offset:a.getLastTimestamp(),now:a,origin:E,features:{},xhrWrappable:O,userAgent:u,disabled:b};if(!b){t(20),t(28),v[w]?(v[w]("DOMContentLoaded",i,l(!1)),m[w]("load",r,l(!1))):(v[g]("onreadystatechange",o),m[g]("onload",r)),s("mark",["firstbyte",a.getLastTimestamp()],null,"api");var P=0}},{}],"wrap-function":[function(t,e,n){function r(t,e){function n(e,n,r,c,f){function nrWrapper(){var i,a,u,p;try{a=this,i=d(arguments),u="function"==typeof r?r(i,a):r||{}}catch(l){o([l,"",[i,a,c],u],t)}s(n+"start",[i,a,c],u,f);try{return p=e.apply(a,i)}catch(h){throw s(n+"err",[i,a,h],u,f),h}finally{s(n+"end",[i,a,p],u,f)}}return a(e)?e:(n||(n=""),nrWrapper[p]=e,i(e,nrWrapper,t),nrWrapper)}function r(t,e,r,o,i){r||(r="");var s,c,f,u="-"===r.charAt(0);for(f=0;f<e.length;f++)c=e[f],s=t[c],a(s)||(t[c]=n(s,u?c+r:r,o,c,i))}function s(n,r,i,a){if(!h||e){var s=h;h=!0;try{t.emit(n,r,i,e,a)}catch(c){o([c,n,r,i],t)}h=s}}return t||(t=u),n.inPlace=r,n.flag=p,n}function o(t,e){e||(e=u);try{e.emit("internal-error",t)}catch(n){}}function i(t,e,n){if(Object.defineProperty&&Object.keys)try{var r=Object.keys(t);return r.forEach(function(n){Object.defineProperty(e,n,{get:function(){return t[n]},set:function(e){return t[n]=e,e}})}),e}catch(i){o([i],n)}for(var a in t)l.call(t,a)&&(e[a]=t[a]);return e}function a(t){return!(t&&t instanceof Function&&t.apply&&!t[p])}function s(t,e){var n=e(t);return n[p]=t,i(t,n,u),n}function c(t,e,n){var r=t[e];t[e]=s(r,n)}function f(){for(var t=arguments.length,e=new Array(t),n=0;n<t;++n)e[n]=arguments[n];return e}var u=t("ee"),d=t(33),p="nr@original",l=Object.prototype.hasOwnProperty,h=!1;e.exports=r,e.exports.wrapFunction=s,e.exports.wrapInPlace=c,e.exports.argsToArray=f},{}]},{},["loader",2,17,5,3,4]);
;NREUM.loader_config={accountID:"804283",trustKey:"804283",agentID:"402703674",licenseKey:"cf99e8d2a3",applicationID:"402703674"}
;NREUM.info={beacon:"bam.nr-data.net",errorBeacon:"bam.nr-data.net",licenseKey:"cf99e8d2a3",
// Modified this value from the generated script, to pass prod vs dev
applicationID: window.location.hostname.includes('journals.plos.org') ? "402703674" : "402694889",
sa:1}
</script>
<!-- End New Relic -->
<header>
<div id="topslot" class="head-top">
<a id="skip-to-content" tabindex="0" class="button" href="#main-content">
Skip to main content
</a>
<div class="center">
<div class="title">Advertisement</div>
<!-- DoubleClick Ad Zone -->
<div class='advertisement' id='div-gpt-ad-1458247671871-0' style='width:728px; height:90px;'>
<script type='text/javascript'>
googletag.cmd.push(function() { googletag.display('div-gpt-ad-1458247671871-0'); });
</script>
</div>
</div>
</div>
<div id="user" class="nav" data-user-management-url="https://community.plos.org">
</div>
<div id="pagehdr">
<nav class="nav-main">
<h1 class="logo">
<a href="/plosone/.">PLOS One</a>
</h1>
<section class="top-bar-section">
<ul class="nav-elements">
<li class="multi-col-parent menu-section-header has-dropdown" id="publish">
Publish
<div class="dropdown mega ">
<ul class="multi-col" id="publish-dropdown-list">
<li class="menu-section-header " id="submissions">
<span class="menu-section-header-title"> Submissions </span>
<ul class="menu-section "
id="submissions-dropdown-list">
<li>
<a href="/plosone/s/getting-started" >Getting Started</a>
</li>
<li>
<a href="/plosone/s/submission-guidelines" >Submission Guidelines</a>
</li>
<li>
<a href="/plosone/s/figures" >Figures</a>
</li>
<li>
<a href="/plosone/s/tables" >Tables</a>
</li>
<li>
<a href="/plosone/s/supporting-information" >Supporting Information</a>
</li>
<li>
<a href="/plosone/s/latex" >LaTeX</a>
</li>
<li>
<a href="/plosone/s/what-we-publish" >What We Publish</a>
</li>
<li>
<a href="/plosone/s/preprints" >Preprints</a>
</li>
<li>
<a href="/plosone/s/revising-your-manuscript" >Revising Your Manuscript</a>
</li>
<li>
<a href="/plosone/s/submit-now" >Submit Now</a>
</li>
<li>
<a href="https://collections.plos.org/s/calls-for-papers" >Calls for Papers</a>
</li>
</ul>
</li>
<li class="menu-section-header " id="policies">
<span class="menu-section-header-title"> Policies </span>
<ul class="menu-section "
id="policies-dropdown-list">
<li>
<a href="/plosone/s/best-practices-in-research-reporting" >Best Practices in Research Reporting</a>
</li>
<li>
<a href="/plosone/s/human-subjects-research" >Human Subjects Research</a>
</li>
<li>
<a href="/plosone/s/animal-research" >Animal Research</a>
</li>
<li>
<a href="/plosone/s/competing-interests" >Competing Interests</a>
</li>
<li>
<a href="/plosone/s/disclosure-of-funding-sources" >Disclosure of Funding Sources</a>
</li>
<li>
<a href="/plosone/s/licenses-and-copyright" >Licenses and Copyright</a>
</li>
<li>
<a href="/plosone/s/data-availability" >Data Availability</a>
</li>
<li>
<a href="/plosone/s/complementary-research" >Complementary Research</a>
</li>
<li>
<a href="/plosone/s/materials-software-and-code-sharing" >Materials, Software and Code Sharing</a>
</li>
<li>
<a href="/plosone/s/ethical-publishing-practice" >Ethical Publishing Practice</a>
</li>
<li>
<a href="/plosone/s/authorship" >Authorship</a>
</li>
<li>
<a href="/plosone/s/corrections-expressions-of-concern-and-retractions" >Corrections, Expressions of Concern, and Retractions</a>
</li>
</ul>
</li>
<li class="menu-section-header " id="manuscript-review-and-publication">
<span class="menu-section-header-title"> Manuscript Review and Publication </span>
<ul class="menu-section "
id="manuscript-review-and-publication-dropdown-list">
<li>
<a href="/plosone/s/criteria-for-publication" >Criteria for Publication</a>
</li>
<li>
<a href="/plosone/s/editorial-and-peer-review-process" >Editorial and Peer Review Process</a>
</li>
<li>
<a href="https://plos.org/resources/editor-center" >Editor Center</a>
</li>
<li>
<a href="/plosone/s/resources-for-editors" >Resources for Editors</a>
</li>
<li>
<a href="/plosone/s/reviewer-guidelines" >Guidelines for Reviewers</a>
</li>
<li>
<a href="/plosone/s/accepted-manuscripts" >Accepted Manuscripts</a>
</li>
<li>
<a href="/plosone/s/comments" >Comments</a>
</li>
</ul>
</li>
</ul>
<div class="calloutcontainer">
<h3 class="callout-headline">Submit Your Manuscript</h3>
<div class="action-contain">
<p class="callout-content">
Discover a faster, simpler path to publishing in a high-quality journal. <em>PLOS ONE</em> promises fair, rigorous peer review,
broad scope, and wide readership – a perfect fit for your research every time.
</p>
<p class="button-contain special">
<a class="button button-default" href="/plosone/static/publish">
Learn More
</a>
<a class="button-link" href="https://www.editorialmanager.com/pone/default.asp">
Submit Now
</a>
</p>
</div> <!-- opens in siteMenuCalloutDescription -->
</div>
</div>
</li>
<li class="menu-section-header has-dropdown " id="about">
<span class="menu-section-header-title"> About </span>
<ul class="menu-section dropdown "
id="about-dropdown-list">
<li>
<a href="/plosone/static/publish" >Why Publish with PLOS ONE</a>
</li>
<li>
<a href="/plosone/s/journal-information" >Journal Information</a>
</li>
<li>
<a href="/plosone/s/staff-editors" >Staff Editors</a>
</li>
<li>
<a href="/plosone/static/editorial-board" >Editorial Board</a>
</li>
<li>
<a href="/plosone/s/section-editors" >Section Editors</a>
</li>
<li>
<a href="/plosone/s/advisory-groups" >Advisory Groups</a>
</li>
<li>
<a href="/plosone/s/find-and-read-articles" >Find and Read Articles</a>
</li>
<li>
<a href="/plosone/s/publishing-information" >Publishing Information</a>
</li>
<li>
<a href="https://plos.org/publication-fees" >Publication Fees</a>
</li>
<li>
<a href="https://plos.org/press-and-media" >Press and Media</a>
</li>
<li>
<a href="/plosone/s/contact" >Contact</a>
</li>
</ul>
</li>
<li data-js-tooltip-hover="trigger" class="subject-area menu-section-header">
Browse
</li>
<script src="/resource/js/vendor/jquery.hoverIntent.js" type="text/javascript"></script>
<script src="/resource/js/components/menu_drop.js" type="text/javascript"></script>
<script src="/resource/js/components/hover_delay.js" type="text/javascript"></script>
<li id="navsearch" class="head-search">
<form name="searchForm" action="/plosone/search" method="get">
<fieldset>
<legend>Search</legend>
<label for="search">Search</label>
<div class="search-contain">
<input id="search" type="text" name="q" placeholder="SEARCH" required/>
<button id="headerSearchButton" type="submit" aria-label="Submit search">
<i title="Submit search" class="search-icon"></i>
</button>
</div>
</fieldset>
<input type="hidden" name="filterJournals" value="PLoSONE"/>
</form>
<a id="advSearch"
href="/plosone/search">
advanced search
</a>
<script src="/resource/js/components/placeholder_style.js" type="text/javascript"></script>
</li>
</ul>
</section>
</nav>
</div>
</header>
<section id="taxonomyContainer">
<script src="/resource/js/taxonomy-browser.js" type="text/javascript"></script>
<div id="taxonomy-browser" class="areas" data-search-url="/plosone/browse">
<div class="wrapper">
<div class="taxonomy-header">
Browse Subject Areas
<div id="subjInfo">?</div>
<div id="subjInfoText">
<p>Click through the PLOS taxonomy to find articles in your field.</p>
<p>For more information about PLOS Subject Areas, click
<a href="https://github.com/PLOS/plos-thesaurus/blob/master/README.md" target="_blank" title="Link opens in new window">here</a>.
</p>
</div>
</div>
<div class="levels">
<div class="levels-container cf">
<div class="levels-position"></div>
</div>
<a href="#" class="prev"></a>
<a href="#" class="next active"></a>
</div>
</div>
<div class="taxonomy-browser-border-bottom"></div>
</div>
</section>
<main id="main-content"> <div class="set-grid">
<header class="title-block">
<script src="/resource/js/components/signposts.js" type="text/javascript"></script>
<ul id="almSignposts" class="signposts">
<li id="loadingMetrics">
<p>Loading metrics</p>
</li>
</ul>
<script type="text/template" id="signpostsGeneralErrorTemplate">
<li id="metricsError">Article metrics are unavailable at this time. Please try again later.</li>
</script>
<script type="text/template" id="signpostsNewArticleErrorTemplate">
<li></li><li></li><li id="tooSoon">Article metrics are unavailable for recently published articles.</li>
</script>
<script type="text/template" id="signpostsTemplate">
<li id="almSaves">
<%= s.numberFormat(saveCount, 0) %>
<div class="tools" data-js-tooltip-hover="trigger">
<a class="metric-term" href="/plosone/article/metrics?id=10.1371/journal.pone.0323079#savedHeader">Save</a>
<p class="saves-tip" data-js-tooltip-hover="target"><a href="/plosone/article/metrics?id=10.1371/journal.pone.0323079#savedHeader">Total Mendeley and Citeulike bookmarks.</a></p>
</div>
</li>
<li id="almCitations">
<%= s.numberFormat(citationCount, 0) %>
<div class="tools" data-js-tooltip-hover="trigger">
<a class="metric-term" href="/plosone/article/metrics?id=10.1371/journal.pone.0323079#citedHeader">Citation</a>
<p class="citations-tip" data-js-tooltip-hover="target"><a href="/plosone/article/metrics?id=10.1371/journal.pone.0323079#citedHeader">Paper's citation count computed by Dimensions.</a></p>
</div>
</li>
<li id="almViews">
<%= s.numberFormat(viewCount, 0) %>
<div class="tools" data-js-tooltip-hover="trigger">
<a class="metric-term" href="/plosone/article/metrics?id=10.1371/journal.pone.0323079#viewedHeader">View</a>
<p class="views-tip" data-js-tooltip-hover="target"><a href="/plosone/article/metrics?id=10.1371/journal.pone.0323079#viewedHeader">PLOS views and downloads.</a></p>
</div>
</li>
<li id="almShares">
<%= s.numberFormat(shareCount, 0) %>
<div class="tools" data-js-tooltip-hover="trigger">
<a class="metric-term" href="/plosone/article/metrics?id=10.1371/journal.pone.0323079#discussedHeader">Share</a>
<p class="shares-tip" data-js-tooltip-hover="target"><a href="/plosone/article/metrics?id=10.1371/journal.pone.0323079#discussedHeader">Sum of Facebook, Twitter, Reddit and Wikipedia activity.</a></p>
</div>
</li>
</script>
<div class="article-meta">
<div class="classifications">
<p class="license-short" id="licenseShort">Open Access</p>
<p class="peer-reviewed" id="peerReviewed">Peer-reviewed</p>
<div class="article-type" >
<p class="type-article" id="artType">Research Article</p>
</div>
</div>
</div>
<div class="article-title-etc">
<div class="title-authors">
<h1 id="artTitle"><?xml version="1.0" encoding="UTF-8"?>Datavzrd: Rapid programming- and maintenance-free interactive visualization and communication of tabular data</h1>
<ul class="author-list clearfix" data-js-tooltip="tooltip_container" id="author-list">
<li
data-js-tooltip="tooltip_trigger"
>
<a data-author-id="0" class="author-name" >
Felix Wiegand <span class="email"> </span>,</a> <div id="author-meta-0" class="author-info" data-js-tooltip="tooltip_target">
<p class="roles" id="authRoles">
<span class="type">Roles</span>
Conceptualization,
Methodology,
Software,
Writing – original draft,
Writing – review & editing
</p>
<p id="authCorresponding-0"> <span class="email">* E-mail:</span> <a href="mailto:felix.wiegand@uni-due.de">felix.wiegand@uni-due.de</a></p>
<p id="authAffiliations-0"><span class="type">Affiliation</span>
Bioinformatics and Computational Oncology, Institute for AI in Medicine (IKIM), University Hospital Essen, University of Duisburg-Essen, Essen, Germany
</p>
<div>
<p class="orcid" id="authOrcid-0">
<span>
<a id="connect-orcid-link" href="https://orcid.org/0009-0003-0725-2120" target="_blank" title="ORCID Registry">
<img id="orcid-id-logo" src="/resource/img/orcid_16x16.png" width="16" height="16" alt="ORCID logo"/>
https://orcid.org/0009-0003-0725-2120
</a>
</span>
</p>
</div>
<a data-js-tooltip="tooltip_close" class="close" id="tooltipClose0"> ⨯ </a>
</div>
</li>
<li
data-js-tooltip="tooltip_trigger"
>
<a data-author-id="1" class="author-name" >
David Lähnemann,</a> <div id="author-meta-1" class="author-info" data-js-tooltip="tooltip_target">
<p class="roles" id="authRoles">
<span class="type">Roles</span>
Writing – review & editing
</p>
<p id="authAffiliations-1"><span class="type">Affiliations</span>
Bioinformatics and Computational Oncology, Institute for AI in Medicine (IKIM), University Hospital Essen, University of Duisburg-Essen, Essen, Germany,
German Cancer Consortium (DKTK), Partner Site Essen-Düsseldorf, A Partnership Between DKFZ and University Hospital Essen, Essen, Germany
</p>
<div>
<p class="orcid" id="authOrcid-1">
<span>
<a id="connect-orcid-link" href="https://orcid.org/0000-0002-9138-4112" target="_blank" title="ORCID Registry">
<img id="orcid-id-logo" src="/resource/img/orcid_16x16.png" width="16" height="16" alt="ORCID logo"/>
https://orcid.org/0000-0002-9138-4112
</a>
</span>
</p>
</div>
<a data-js-tooltip="tooltip_close" class="close" id="tooltipClose1"> ⨯ </a>
</div>
</li>
<li
data-js-tooltip="tooltip_trigger"
>
<a data-author-id="2" class="author-name" >
Felix Mölder,</a> <div id="author-meta-2" class="author-info" data-js-tooltip="tooltip_target">
<p class="roles" id="authRoles">
<span class="type">Roles</span>
Writing – review & editing
</p>
<p id="authAffiliations-2"><span class="type">Affiliations</span>
Bioinformatics and Computational Oncology, Institute for AI in Medicine (IKIM), University Hospital Essen, University of Duisburg-Essen, Essen, Germany,
Institute of Pathology, University Hospital Essen, University of Duisburg-Essen, Essen, Germany
</p>
<a data-js-tooltip="tooltip_close" class="close" id="tooltipClose2"> ⨯ </a>
</div>
</li>
<li
data-js-tooltip="tooltip_trigger"
>
<a data-author-id="3" class="author-name" >
Hamdiye Uzuner,</a> <div id="author-meta-3" class="author-info" data-js-tooltip="tooltip_target">
<p class="roles" id="authRoles">
<span class="type">Roles</span>
Writing – review & editing
</p>
<p id="authAffiliations-3"><span class="type">Affiliation</span>
Bioinformatics and Computational Oncology, Institute for AI in Medicine (IKIM), University Hospital Essen, University of Duisburg-Essen, Essen, Germany
</p>
<a data-js-tooltip="tooltip_close" class="close" id="tooltipClose3"> ⨯ </a>
</div>
</li>
<li
data-js-tooltip="tooltip_trigger"
>
<a data-author-id="4" class="author-name" >
Adrian Prinz,</a> <div id="author-meta-4" class="author-info" data-js-tooltip="tooltip_target">
<p class="roles" id="authRoles">
<span class="type">Roles</span>
Writing – review & editing
</p>
<p id="authAffiliations-4"><span class="type">Affiliation</span>
Bioinformatics and Computational Oncology, Institute for AI in Medicine (IKIM), University Hospital Essen, University of Duisburg-Essen, Essen, Germany
</p>
<div>
<p class="orcid" id="authOrcid-4">
<span>
<a id="connect-orcid-link" href="https://orcid.org/0009-0000-9462-5228" target="_blank" title="ORCID Registry">
<img id="orcid-id-logo" src="/resource/img/orcid_16x16.png" width="16" height="16" alt="ORCID logo"/>
https://orcid.org/0009-0000-9462-5228
</a>
</span>
</p>
</div>
<a data-js-tooltip="tooltip_close" class="close" id="tooltipClose4"> ⨯ </a>
</div>
</li>
<li
data-js-tooltip="tooltip_trigger"
>
<a data-author-id="5" class="author-name" >
Alexander Schramm,</a> <div id="author-meta-5" class="author-info" data-js-tooltip="tooltip_target">
<p class="roles" id="authRoles">
<span class="type">Roles</span>
Writing – review & editing
</p>
<p id="authAffiliations-5"><span class="type">Affiliation</span>
Laboratory of Molecular Oncology, West German Cancer Center, Department of Medical Oncology, University Hospital Essen, Essen, Germany
</p>
<div>
<p class="orcid" id="authOrcid-5">
<span>
<a id="connect-orcid-link" href="https://orcid.org/0000-0001-7670-7529" target="_blank" title="ORCID Registry">
<img id="orcid-id-logo" src="/resource/img/orcid_16x16.png" width="16" height="16" alt="ORCID logo"/>
https://orcid.org/0000-0001-7670-7529
</a>
</span>
</p>
</div>
<a data-js-tooltip="tooltip_close" class="close" id="tooltipClose5"> ⨯ </a>
</div>
</li>
<li
data-js-tooltip="tooltip_trigger"
>
<a data-author-id="6" class="author-name" >
Johannes Köster</a> <div id="author-meta-6" class="author-info" data-js-tooltip="tooltip_target">
<p class="roles" id="authRoles">
<span class="type">Roles</span>
Conceptualization,
Methodology,
Software,
Supervision,
Writing – original draft,
Writing – review & editing
</p>
<p id="authAffiliations-6"><span class="type">Affiliation</span>
Bioinformatics and Computational Oncology, Institute for AI in Medicine (IKIM), University Hospital Essen, University of Duisburg-Essen, Essen, Germany
</p>
<div>
<p class="orcid" id="authOrcid-6">
<span>
<a id="connect-orcid-link" href="https://orcid.org/0000-0001-9818-9320" target="_blank" title="ORCID Registry">
<img id="orcid-id-logo" src="/resource/img/orcid_16x16.png" width="16" height="16" alt="ORCID logo"/>
https://orcid.org/0000-0001-9818-9320
</a>
</span>
</p>
</div>
<a data-js-tooltip="tooltip_close" class="close" id="tooltipClose6"> ⨯ </a>
</div>
</li>
</ul>
<script src="/resource/js/components/tooltip.js" type="text/javascript"></script>
</div>
<div id="floatTitleTop" data-js-floater="title_author" class="float-title" role="presentation">
<div class="set-grid">
<div class="float-title-inner">
<h1><?xml version="1.0" encoding="UTF-8"?>Datavzrd: Rapid programming- and maintenance-free interactive visualization and communication of tabular data</h1>
<ul id="floatAuthorList" data-js-floater="floated_authors">
<li data-float-index="1">Felix Wiegand,
</li>
<li data-float-index="2">David Lähnemann,
</li>
<li data-float-index="3">Felix Mölder,
</li>
<li data-float-index="4">Hamdiye Uzuner,
</li>
<li data-float-index="5">Adrian Prinz,
</li>
<li data-float-index="6">Alexander Schramm,
</li>
<li data-float-index="7">Johannes Köster
</li>
</ul>
</div>
<div class="logo-close" id="titleTopCloser">
<img src="/resource/img/logo-plos-full-color.svg" style="height: 2em" alt="PLOS" />
<div class="close-floater" title="close">x</div>
</div>
</div>
</div>
<ul class="date-doi">
<li id="artPubDate">Published: July 22, 2025</li>
<li id="artDoi">
<a href="https://doi.org/10.1371/journal.pone.0323079">https://doi.org/10.1371/journal.pone.0323079</a>
</li>
<li class="flex-spacer"></li>
</ul>
</div>
<div>
</div>
</header>
<section class="article-body">
<ul class="article-tabs">
<li class="tab-title active" id="tabArticle">
<a href="/plosone/article?id=10.1371/journal.pone.0323079" class="article-tab-1">Article</a>
</li>
<li class="tab-title " id="tabAuthors">
<a href="/plosone/article/authors?id=10.1371/journal.pone.0323079" class="article-tab-2">Authors</a>
</li>
<li class="tab-title " id="tabMetrics">
<a href="/plosone/article/metrics?id=10.1371/journal.pone.0323079" class="article-tab-3">Metrics</a>
</li>
<li class="tab-title " id="tabComments">
<a href="/plosone/article/comments?id=10.1371/journal.pone.0323079" class="article-tab-4">Comments</a>
</li>
<li class="tab-title" id="tabRelated">
<a class="article-tab-5" id="tabRelated-link" target="_blank" href="http://plos.altmetric.com/details/doi/10.1371/journal.pone.0323079">Media Coverage</a>
</li>
<li class="tab-title " id="tabPeerReview">
<a href="/plosone/article/peerReview?id=10.1371/journal.pone.0323079" class="article-tab-6">Peer Review</a>
</li>
</ul>
<div class="article-container">
<div id="nav-article">
<ul class="nav-secondary">
<li class="nav-comments" id="nav-comments">
<a href="article/comments?id=10.1371/journal.pone.0323079">Reader Comments</a>
</li>
<li id="nav-figures"><a href="#" data-doi="10.1371/journal.pone.0323079">Figures</a></li>
</ul>
<div id="nav-data-linking" data-data-url="https://github.com/datavzrd/datavzrd">
</div>
</div>
<script src="/resource/js/components/scroll.js" type="text/javascript"></script>
<script src="/resource/js/components/nav_builder.js" type="text/javascript"></script>
<script src="/resource/js/components/floating_nav.js" type="text/javascript"></script>
<div id="figure-lightbox-container"></div>
<script id="figure-lightbox-template" type="text/template">
<div id="figure-lightbox" class="reveal-modal full" data-reveal aria-hidden="true"
role="dialog">
<div class="lb-header">
<h1 id="lb-title"><%= articleTitle %></h1>
<div id="lb-authors">
<span>Felix Wiegand</span>
<span>David Lähnemann</span>
<a class="more-authors" href="/plosone/article/authors?id=10.1371/journal.pone.0323079">...</a>
<span>Johannes Köster</span>
</div>
<div class="lb-close" title="close"> </div>
</div>
<div class="img-container">
<div class="loader"> <i class="fa-spinner"></i> </div>
<img class="main-lightbox-image" src=""/>
<aside id="figures-list">
<% figureList.each(function (ix, figure) { %>
<div class="change-img" data-doi="<%= figure.getAttribute('data-doi') %>">
<img class="aside-figure" src="/plosone/article/figure/image?size=inline&id=<%= figure.getAttribute('data-doi') %>" />
</div>
<% }) %>
<div class="dummy-figure">
</div>
</aside>
</div>
<div id="lightbox-footer">
<div id="btns-container" class="lightbox-row <% if(figureList.length <= 1) { print('one-figure-only') } %>">
<div class="fig-btns-container reset-zoom-wrapper left">
<span class="fig-btn reset-zoom-btn">Reset zoom</span>
</div>
<div class="zoom-slider-container">
<div class="range-slider-container">
<span id="lb-zoom-min"></span>
<div class="range-slider round" data-slider data-options="start: 20; end: 200; initial: 20;">
<span class="range-slider-handle" role="slider" tabindex="0"></span>
<span class="range-slider-active-segment"></span>
<input type="hidden">
</div>
<span id="lb-zoom-max"></span>
</div>
</div>
<% if(figureList.length > 1) { %>
<div class="fig-btns-container">
<span class="fig-btn all-fig-btn"><i class="icon icon-all"></i> All Figures</span>
<span class="fig-btn next-fig-btn"><i class="icon icon-next"></i> Next</span>
<span class="fig-btn prev-fig-btn"><i class="icon icon-prev"></i> Previous</span>
</div>
<% } %>
</div>
<div id="image-context">
</div>
</div>
</div>
</script>
<script id="image-context-template" type="text/template">
<div class="footer-text">
<div id="figure-description-wrapper">
<div id="view-more-wrapper" style="<% descriptionExpanded? print('display:none;') : '' %>">
<span id="figure-title"><%= title %></span>
<p id="figure-description">
<%= description %>
</p>
<span id="view-more">show more<i class="icon-arrow-right"></i></span>
</div>
<div id="view-less-wrapper" style="<% descriptionExpanded? print('display:inline-block;') : '' %>" >
<span id="figure-title"><%= title %></span>
<p id="full-figure-description">
<%= description %>
<span id="view-less">show less<i class="icon-arrow-left"></i></span>
</p>
</div>
</div>
</div>
<div id="show-context-container">
<a class="btn show-context" href="<%= showInContext(strippedDoi) %>">Show in Context</a>
</div>
<div id="download-buttons">
<h3>Download:</h3>
<div class="item">
<a href="/plosone/article/figure/image?size=original&download=&id=<%= doi %>" title="original image">
<span class="download-btn">TIFF</span>
</a>
<span class="file-size"><%= fileSizes.original %></span>
</div>
<div class="item">
<a href="/plosone/article/figure/image?size=large&download=&id=<%= doi %>" title="large image">
<span class="download-btn">PNG</span>
</a>
<span class="file-size"><%= fileSizes.large %></span>
</div>
<div class="item">
<a href="/plosone/article/figure/powerpoint?id=<%= doi %>" title="PowerPoint slide">
<span class="download-btn">PPT</span>
</a>
</div>
</div>
</script>
<div class="article-content">
<div id="figure-carousel-section">
<h2>Figures</h2>
<div id="figure-carousel">
<div class="carousel-wrapper">
<div class="slider">
<div class="carousel-item lightbox-figure" data-doi="10.1371/journal.pone.0323079.g001">
<img src="/plosone/article/figure/image?size=inline&id=10.1371/journal.pone.0323079.g001"
loading="lazy"
alt="Fig 1"
/>
</div>
<div class="carousel-item lightbox-figure" data-doi="10.1371/journal.pone.0323079.g002">
<img src="/plosone/article/figure/image?size=inline&id=10.1371/journal.pone.0323079.g002"
loading="lazy"
alt="Fig 2"
/>
</div>
<div class="carousel-item lightbox-figure" data-doi="10.1371/journal.pone.0323079.g003">
<img src="/plosone/article/figure/image?size=inline&id=10.1371/journal.pone.0323079.g003"
loading="lazy"
alt="Fig 3"
/>
</div>
<div class="carousel-item lightbox-figure" data-doi="10.1371/journal.pone.0323079.g004">
<img src="/plosone/article/figure/image?size=inline&id=10.1371/journal.pone.0323079.g004"
loading="lazy"
alt="Fig 4"
/>
</div>
<div class="carousel-item lightbox-figure" data-doi="10.1371/journal.pone.0323079.g005">
<img src="/plosone/article/figure/image?size=inline&id=10.1371/journal.pone.0323079.g005"
loading="lazy"
alt="Fig 5"
/>
</div>
<div class="carousel-item lightbox-figure" data-doi="10.1371/journal.pone.0323079.g006">
<img src="/plosone/article/figure/image?size=inline&id=10.1371/journal.pone.0323079.g006"
loading="lazy"
alt="Fig 6"
/>
</div>
<div class="carousel-item lightbox-figure" data-doi="10.1371/journal.pone.0323079.g007">
<img src="/plosone/article/figure/image?size=inline&id=10.1371/journal.pone.0323079.g007"
loading="lazy"
alt="Fig 7"
/>
</div>
<div class="carousel-item lightbox-figure" data-doi="10.1371/journal.pone.0323079.g008">
<img src="/plosone/article/figure/image?size=inline&id=10.1371/journal.pone.0323079.g008"
loading="lazy"
alt="Fig 8"
/>
</div>
<div class="carousel-item lightbox-figure" data-doi="10.1371/journal.pone.0323079.g009">
<img src="/plosone/article/figure/image?size=inline&id=10.1371/journal.pone.0323079.g009"
loading="lazy"
alt="Fig 9"
/>
</div>
<div class="carousel-item lightbox-figure" data-doi="10.1371/journal.pone.0323079.g010">
<img src="/plosone/article/figure/image?size=inline&id=10.1371/journal.pone.0323079.g010"
loading="lazy"
alt="Fig 10"
/>
</div>
<div class="carousel-item lightbox-figure" data-doi="10.1371/journal.pone.0323079.g011">
<img src="/plosone/article/figure/image?size=inline&id=10.1371/journal.pone.0323079.g011"
loading="lazy"
alt="Fig 11"
/>
</div>
</div>
</div>
<div class="carousel-control">
<span class="button previous"></span>
<span class="button next"></span>
</div>
<div class="carousel-page-buttons">
</div>
</div>
</div>
<script src="/resource/js/vendor/jquery.touchswipe.js" type="text/javascript"></script>
<script src="/resource/js/components/figure_carousel.js" type="text/javascript"></script>
<script src="/resource/js/vendor/jquery.dotdotdot.js" type="text/javascript"></script>
<div class="article-text" id="artText">
<div xmlns:plos="http://plos.org" class="abstract toc-section abstract-type-"><a id="abstract0" name="abstract0" data-toc="abstract0" class="link-target" title="Abstract"></a><h2>Abstract</h2><div class="abstract-content"><a id="article1.front1.article-meta1.abstract1.p1" name="article1.front1.article-meta1.abstract1.p1" class="link-target"></a><p>Tabular data, often scattered across multiple tables, is the primary output of data analyses in virtually all scientific fields. Exchange and communication of tabular data is therefore a central challenge. We present <em>Datavzrd</em>, a tool for creating portable, visually rich, interactive reports from tabular data in any kind of scientific discipline. <em>Datavzrd</em> unifies the strengths of currently common generic approaches for interactive visualization like R Shiny with the portability, ease of use and sustainability of plain spreadsheets. The generated reports do not require the maintenance of a web server nor the installation of specialized software for viewing and can simply be attached to emails, shared via cloud services, or serve as manuscript supplements. They can be specified without requiring imperative programming, thereby enabling rapid development and offering accessibility for non-computational scientists, unlocking the look and feel of dedicated manually crafted web applications without the maintenance and development burden. <em>Datavzrd</em> reports scale from small tables to thousands or millions of rows and offer the ability to link multiple related tables, allowing to jump between corresponding rows or hierarchically explore growing levels of detail.</p>
</div></div>
<div xmlns:plos="http://plos.org" class="articleinfo"><p><strong>Citation: </strong>Wiegand F, Lähnemann D, Mölder F, Uzuner H, Prinz A, Schramm A, et al. (2025) Datavzrd: Rapid programming- and maintenance-free interactive visualization and communication of tabular data. PLoS One 20(7):
e0323079.
https://doi.org/10.1371/journal.pone.0323079</p><p><strong>Editor: </strong>Vivek Kumar, Cold Spring Harbor Laboratory, UNITED STATES OF AMERICA</p><p><strong>Received: </strong>April 2, 2025; <strong>Accepted: </strong>July 7, 2025; <strong>Published: </strong> July 22, 2025</p><p><strong>Copyright: </strong> © 2025 Wiegand et al. This is an open access article distributed under the terms of the <a href="http://creativecommons.org/licenses/by/4.0/">Creative Commons Attribution License</a>, which permits unrestricted use, distribution, and reproduction in any medium, provided the original author and source are credited.</p><p><strong>Data Availability: </strong>Code is available under <a href="https://github.com/datavzrd/datavzrd">https://github.com/datavzrd/datavzrd</a>.</p><p><strong>Funding: </strong>The author(s) received no specific funding for this work.</p><p><strong>Competing interests: </strong> The authors have declared that no competing interests exist.</p></div>
<div xmlns:plos="http://plos.org" id="section1" class="section toc-section"><a id="sec001" name="sec001" data-toc="sec001" class="link-target" title="Introduction"></a><h2>Introduction</h2><a id="article1.body1.sec1.p1" name="article1.body1.sec1.p1" class="link-target"></a><p>Tabular datasets, prevalent across diverse scientific fields such as biology, physics, economics, and environmental science, stand as the primary outcomes of scientific investigations. Communicating such results in a way that others can access the contained information at ideally the same level of detail as the original analysis author is a major cornerstone of reproducibility and transparency <em>after</em> publication. Moreover, it is important for the efficiency of scientific communication <em>before</em> publication, enabling non-computational scientists to, for example, dive deeply into data underlying high-level figures.</p>
<a id="article1.body1.sec1.p2" name="article1.body1.sec1.p2" class="link-target"></a><p>A traditional option for such communication are spreadsheet applications like <em>Excel</em> (and their corresponding file format xlsx, in the following for simplicity called <em>Excel</em> files) which is still commonly regarded as a primary choice, especially among non-computer science professionals. Most spreadsheet applications, including <em>Excel</em>, lack the capability to quickly and easily visualize different columns of a dataset. They also do not support reproducibility of results for similar datasets without repeating the work. Finally, multiple investigations of supplementary Excel files show that the automated conversion of certain values can lead to the misinterpretation of data: for example, gene names such as <em>SEPT2</em> (Septin 2) are inadvertently converted into dates, leading to errors in genomic research [<a href="#pone.0323079.ref004" class="ref-tip">4</a>,<a href="#pone.0323079.ref007" class="ref-tip">7</a>].</p>
<a id="article1.body1.sec1.p3" name="article1.body1.sec1.p3" class="link-target"></a><p>Beyond plain spreadsheet representations, other solutions are available. Naturally, any general purpose programming language (e.g. Python or R) or transformation languages (e.g. XSLT) could be used (e.g. in comparison with helper libraries like great-tables [<a href="#pone.0323079.ref026" class="ref-tip">26</a>]) to implement entirely custom reporting. Moreover, various frameworks have been developed that further simplify these tasks. <em>Shiny</em> [<a href="#pone.0323079.ref009" class="ref-tip">9</a>] works by implementing the intended visuals and corresponding interfaces in an R or Python script, which is then executed in a server process that provides the resulting user interface in the form of served HTML pages. ShinyApps.io [<a href="#pone.0323079.ref027" class="ref-tip">27</a>] enables easy hosting of <em>Shiny</em> applications without the need to maintain an own web server. However, at the time of writing, it is limited to five applications, 25 usage hours per month, and 1 GB per dataset with the free plan. Similarly to Shiny, <em>Dash</em> [<a href="#pone.0323079.ref028" class="ref-tip">28</a>] allows creating interactive dashboards with Python code, but also requiring a running server process. <em>Lumen</em> [<a href="#pone.0323079.ref029" class="ref-tip">29</a>] provides data-driven dashboards that can be configured without requiring imperative programming, using the declarative YAML language, but also requires a server process. Of course, charting libraries such as D3.js [<a href="#pone.0323079.ref030" class="ref-tip">30</a>] or Plotly [<a href="#pone.0323079.ref031" class="ref-tip">31</a>] enable the creation of interactive visualizations, but using them within tables requires substantial bespoke coding and web development effort. MultiQC [<a href="#pone.0323079.ref002" class="ref-tip">2</a>] enables the summarization of various standard formats into single-page HTML-based reports. Unlike Dash, Lumen, and Shiny, MultiQC reports are portable and do not require a running web server. Apart from pre-implemented standard formats, MultiQC also offers the ability to specify custom data, however, without being able to interactively explore large interrelated complex tables.</p>
<a id="article1.body1.sec1.p4" name="article1.body1.sec1.p4" class="link-target"></a><p>Finally, there are numerous specialized web applications that aim to make certain domain specific kinds of data explorable [<a href="#pone.0323079.ref014" class="ref-tip">14</a>–<a href="#pone.0323079.ref018" class="ref-tip">18</a>]. Those applications often combine query interfaces with tabular and plot based visualizations, backed by a server process that extracts information from a database. Their development is complex and requires thousands of lines of code and work hours, although they share similar visuals, and likewise require substantial workload for maintenance of the installation. Finally, data security requirements often turn their exposure to the public into a complex and sometimes even impossible task, so that they cannot be easily used to communicate the results supporting a publication in a transparent way.</p>
<a id="article1.body1.sec1.p5" name="article1.body1.sec1.p5" class="link-target"></a><p>So far, there was no solution available that would maintain both a visual and interactive interface to any kind and size of tabular data as well as maintenance-free, reliable, and sustainable availability guarantees.</p>
<a id="article1.body1.sec1.p6" name="article1.body1.sec1.p6" class="link-target"></a><p>To overcome this situation, we present <em>Datavzrd</em> (<a href="https://datavzrd.github.io">https://datavzrd.github.io</a>), which aims to provide visually rich, interactive, and portable representations of tabular data, while avoiding the caveats with above listed approaches. Datavzrd can be used in virtually any kind of data analysis for any kind of tabular data type in a rapid and ad-hoc fashion, obviating the need for specialized implementations and continuous maintenance as well as deployment of a web application.</p>
<a id="article1.body1.sec1.p7" name="article1.body1.sec1.p7" class="link-target"></a><p><em>Datavzrd</em> is implemented as a command line application with the <em>Rust</em> [<a href="#pone.0323079.ref032" class="ref-tip">32</a>] programming language. It is available as an MIT licensed open source software via <em>GitHub</em> [<a href="#pone.0323079.ref033" class="ref-tip">33</a>], can be installed via <em>Cargo</em> [<a href="#pone.0323079.ref034" class="ref-tip">34</a>] and <em>Conda</em> [<a href="#pone.0323079.ref035" class="ref-tip">35</a>], or used as a <em>Snakemake</em> wrapper [<a href="#pone.0323079.ref036" class="ref-tip">36</a>] for rapid integration into reproducible data analysis workflows.</p>
</div>
<div xmlns:plos="http://plos.org" id="section2" class="section toc-section"><a id="sec002" name="sec002" data-toc="sec002" class="link-target" title="Results"></a><h2>Results</h2>
<div id="section1" class="section toc-section"><a id="sec003" name="sec003" class="link-target" title="Feature overview"></a>
<h3>Feature overview</h3>
<a id="article1.body1.sec2.sec1.p1" name="article1.body1.sec2.sec1.p1" class="link-target"></a><p>Without requiring imperative programming, <em>Datavzrd</em> can produce highly interactive and visually rich interfaces (cf. <a href="#pone-0323079-g002">Fig 2</a>) from tabular input files in various formats (CSV, TSV, Parquet [<a href="#pone.0323079.ref037" class="ref-tip">37</a>] or JSON). Using simple YAML-based declarative specifications, users define datasets along with the desired visualizations for each column. The self-contained report is then generated by executing <em>Datavzrd</em> with the command <span class="monospace">datavzrd path/to/config.yaml -o path/to/output</span>. Within the YAML specifications, a plethora of visual standard elements can be activated per table column, including tick plots (<a href="#pone-0323079-g011">Fig 11A</a>), bar plots (<a href="#pone-0323079-g011">Fig 11B</a>), heatmaps (<a href="#pone-0323079-g011">Fig 11C</a>), pill plots (<a href="#pone-0323079-g011">Fig 11D</a>), ellipsis, custom plots, linkouts (<a href="#pone-0323079-g011">Fig 11E</a>), and scientific notation of floating point numbers. The resulting per-cell visualizations are complemented by extensive annotation and control over the displayed tables, including sorting, filtering and searching (<a href="#pone-0323079-g009">Fig 9</a>), optional line number display, per-column histograms, additional header rows, table descriptions, and the ability to hide columns into a detail-mode.</p>
<a class="link-target" id="pone-0323079-g001" name="pone-0323079-g001"></a><div class="figure" data-doi="10.1371/journal.pone.0323079.g001"><div class="img-box"><a title="Click for larger image" href="article/figure/image?size=medium&id=10.1371/journal.pone.0323079.g001" data-doi="10.1371/journal.pone.0323079" data-uri="10.1371/journal.pone.0323079.g001"><img src="article/figure/image?size=inline&id=10.1371/journal.pone.0323079.g001" alt="thumbnail" class="thumbnail" loading="lazy"></a><div class="expand"></div></div><div class="figure-inline-download">
Download:
<ul><li><a href="article/figure/powerpoint?id=10.1371/journal.pone.0323079.g001"><div class="definition-label">PPT</div><div class="definition-description">PowerPoint slide</div></a></li><li><a href="article/figure/image?download&size=large&id=10.1371/journal.pone.0323079.g001"><div class="definition-label">PNG</div><div class="definition-description">larger image</div></a></li><li><a href="article/figure/image?download&size=original&id=10.1371/journal.pone.0323079.g001"><div class="definition-label">TIFF</div><div class="definition-description">original image</div></a></li></ul></div><div class="figcaption"><span>Fig 1. </span> Timeline comparison.</div><p class="caption_target"><a id="article1.body1.sec2.sec1.fig1.caption1.p1" name="article1.body1.sec2.sec1.fig1.caption1.p1" class="link-target"></a><p>Comparison of the work items needed for publication and communication and the interaction capabilities of <em>Datavzrd</em> compared to above mentioned alternative approaches. Time per step is meant as a relative approximation of the true times, which may of course vary depending on the actual kind of data that shall be handled. We postulate that, for example, simple configuration requires less time than backend or frontend implementation and running a command line tool like <em>Datavzrd</em> is less effort than deploying a web service on a given infrastructure. Finally, the required effort for <em>Datavzrd</em> ends with the publication of the generated static HTML files, whereas server based approaches require continuous maintenance of their deployment in order to remain secure, operable, and accessible.</p>
</p><p class="caption_object"><a href="https://doi.org/10.1371/journal.pone.0323079.g001">
https://doi.org/10.1371/journal.pone.0323079.g001</a></p></div><a class="link-target" id="pone-0323079-g002" name="pone-0323079-g002"></a><div class="figure" data-doi="10.1371/journal.pone.0323079.g002"><div class="img-box"><a title="Click for larger image" href="article/figure/image?size=medium&id=10.1371/journal.pone.0323079.g002" data-doi="10.1371/journal.pone.0323079" data-uri="10.1371/journal.pone.0323079.g002"><img src="article/figure/image?size=inline&id=10.1371/journal.pone.0323079.g002" alt="thumbnail" class="thumbnail" loading="lazy"></a><div class="expand"></div></div><div class="figure-inline-download">
Download:
<ul><li><a href="article/figure/powerpoint?id=10.1371/journal.pone.0323079.g002"><div class="definition-label">PPT</div><div class="definition-description">PowerPoint slide</div></a></li><li><a href="article/figure/image?download&size=large&id=10.1371/journal.pone.0323079.g002"><div class="definition-label">PNG</div><div class="definition-description">larger image</div></a></li><li><a href="article/figure/image?download&size=original&id=10.1371/journal.pone.0323079.g002"><div class="definition-label">TIFF</div><div class="definition-description">original image</div></a></li></ul></div><div class="figcaption"><span>Fig 2. </span> Screenshot of a Datavzrd report with annotated visual elements and controls.</div><p class="caption_target"><a id="article1.body1.sec2.sec1.fig2.caption1.p1" name="article1.body1.sec2.sec1.fig2.caption1.p1" class="link-target"></a><p>The underlying example dataset entails genomic variants along with various scores and predictions. Gene names and coordinates have been altered to de-identify the data. Source: <a href="https://github.com/snakemake-workflows/dna-seq-varlociraptor">https://github.com/snakemake-workflows/dna-seq-varlociraptor</a>. An interactive version of this report is available under <a href="https://datavzrd.github.io/example-molecular-tumor-board">https://datavzrd.github.io/example-molecular-tumor-board</a>.</p>
</p><p class="caption_object"><a href="https://doi.org/10.1371/journal.pone.0323079.g002">
https://doi.org/10.1371/journal.pone.0323079.g002</a></p></div><a id="article1.body1.sec2.sec1.p2" name="article1.body1.sec2.sec1.p2" class="link-target"></a><p>Beyond single tables, it offers the ability to jump back and forth between corresponding rows in multiple related tables and to create custom visualizations that entirely replace the default table views with Vega-Lite [<a href="#pone.0323079.ref003" class="ref-tip">3</a>] plots or plain HTML. Importantly, <em>Datavzrd</em> reports are encoded as standalone HTML files that do not require a web server for viewing them and can be simply opened in any HTML5 [<a href="#pone.0323079.ref038" class="ref-tip">38</a>] compliant web browser. This way, they can be easily shared via Email or attached as supplementary files to publications. Additionally, it also eliminates server maintenance and reduces server load by shifting processing load to the browser (without hampering scalability, see section Scalability).</p>
<a id="article1.body1.sec2.sec1.p3" name="article1.body1.sec2.sec1.p3" class="link-target"></a><p>For enhanced accessibility and ease of hosting, <em>Datavzrd</em> provides a <span class="monospace">publish</span> subcommand, which automates the upload of reports to a newly created or existing GitHub repository using a simple command-line invocation. Afterwards it provides the user with a link to the repository settings where GitHub Pages [<a href="#pone.0323079.ref039" class="ref-tip">39</a>] need to be enabled manually — once upon initial publication of the repository. This way authors can ensure transparency and continuous public availability of their results without the burden of maintaining a web server.</p>
<a id="article1.body1.sec2.sec1.p4" name="article1.body1.sec2.sec1.p4" class="link-target"></a><p>To further simplify the configuration process, <em>Datavzrd</em> also includes the <span class="monospace">suggest</span> subcommand, which automatically generates a YAML configuration file based on one or more input CSV files. By inferring column types and suggesting suitable visualizations, it enables rapid report creation, allowing users to focus on their data rather than technical details.</p>
<a id="article1.body1.sec2.sec1.p5" name="article1.body1.sec2.sec1.p5" class="link-target"></a><p>The result is that Datavzrd’s approach offers a more rapid path towards reproducible, transparent, comprehensive and informative communication of tabular scientific results that moreover is free of continued maintenance tasks (see <a href="#pone-0323079-g001">Fig 1</a> and the Shiny vs. Datavzrd comparison in the supplement). Via compression methods and data partitioning strategies, <em>Datavzrd</em> is scalable towards big datasets without overwhelming the browser memory while still maintaining interactive capabilities. An overview of Datavzrd’s out of the box visual interface capabilities can be found in <a href="#pone-0323079-g002">Fig 2</a>.</p>
</div>
<div id="section2" class="section toc-section"><a id="sec004" name="sec004" class="link-target" title="Community driven extensibility"></a>
<h3>Community driven extensibility</h3>
<a id="article1.body1.sec2.sec2.p1" name="article1.body1.sec2.sec2.p1" class="link-target"></a><p><em>Datavzrd</em> offers the ability to share recurrent configuration snippets for columns or views as so-called <em>spells</em>. This can be helpful since data analyses are likely to share columns with values that can be interpreted and visualized similarly, even when their field of application might be completely different. Examples for such cases are columns with boolean values (e.g. 0/1 or true/false) or columns with p-values or posterior probabilities.</p>
<a id="article1.body1.sec2.sec2.p2" name="article1.body1.sec2.sec2.p2" class="link-target"></a><p>A <em>spell</em> is a reusable template that defines the rendering of a specific column or view in a <em>Datavzrd</em> report. Each <em>spell</em> is written in YAML and supports parameterization through YTE [<a href="#pone.0323079.ref040" class="ref-tip">40</a>], a YAML template engine, allowing users to pass custom values to the spell using the keyword ‘with‘. For example, a p-value spell might define a heatmap to visually represent statistical significance, where a configurable significance threshold determines the color gradient. In practice, users can apply a spell by specifying it directly within a report configuration as shown in the configuration of <a href="#pone-0323079-g004">Fig 4</a>.</p>
<a id="article1.body1.sec2.sec2.p3" name="article1.body1.sec2.sec2.p3" class="link-target"></a><p><em>Spells</em> can be published in a central repository [<a href="#pone.0323079.ref041" class="ref-tip">41</a>] and explored via an automatically updated catalog [<a href="#pone.0323079.ref042" class="ref-tip">42</a>] so that others can reuse them in their own <em>Datavzrd</em> reports. This collaborative approach fosters a shared library of visualization techniques that grows and adapts to evolving research needs across disciplines, thereby obviating the need to reinvent the wheel for visualizing common data types. Since <em>spells</em> can also encode full views, they can be used to easily create reports with pre-defined visualizations for virtually any tool creating tabular output.</p>
</div>
<div id="section3" class="section toc-section"><a id="sec005" name="sec005" class="link-target" title="Example reports for various scientific disciplines"></a>
<h3>Example reports for various scientific disciplines</h3>
<a id="article1.body1.sec2.sec3.p1" name="article1.body1.sec2.sec3.p1" class="link-target"></a><p>To highlight Datavzrd’s field-agnostic application across various scientific disciplines we created <em>Datavzrd</em> reports from the supplementary data of four recently published papers [<a href="#pone.0323079.ref019" class="ref-tip">19</a>–<a href="#pone.0323079.ref022" class="ref-tip">22</a>], each originating from different fields: bioinformatics [<a href="#pone.0323079.ref043" class="ref-tip">43</a>], social science [<a href="#pone.0323079.ref044" class="ref-tip">44</a>], astronomy [<a href="#pone.0323079.ref045" class="ref-tip">45</a>], and anthropology [<a href="#pone.0323079.ref046" class="ref-tip">46</a>]. We have published the reports on GitHub pages using the <span class="monospace">publish</span> subcommand outlined above. <a href="https://datavzrd.github.io/example-report-moscot/index.html?view=Suppl.%20Tab.%2013">Tables 13 - 18</a> from Klein <em>et al</em>. [<a href="#pone.0323079.ref020" class="ref-tip">20</a>] let the user navigate between driver genes of different cell types while also directly providing access to aforementioned genes in the Ensembl database. <a href="https://datavzrd.github.io/example-report-moscot/index.html?view=Suppl.%20Tab.%2025">Table 25</a> of the same publication directly provides access to given genomic regions in the integrative genomics viewer [<a href="#pone.0323079.ref023" class="ref-tip">23</a>] using a linkout. Instead of simply displaying numeric values with a given uncertainty (e.g. <span class="inline-formula"><img src="article/file?type=thumbnail&id=10.1371/journal.pone.0323079.e001" loading="lazy" class="inline-graphic"></span>) as plain text, <a href="https://datavzrd.github.io/example-report-beaded-attires-study/index.html?view=Radiocarbon%20dates%20\%28Montelirio\%20tholos\%29">a table containing radiocarbon data</a> from L. G. Sanjuán <em>et al</em>. [<a href="#pone.0323079.ref019" class="ref-tip">19</a>] shows them in a convenient tick plot with the range of the uncertainty depicted as a red range bar and the central value represented as a blue tick. Individual views are presented exemplarily in <a href="#pone-0323079-g003">Figs 3</a>, <a href="#pone-0323079-g004">4</a>, <a href="#pone-0323079-g005">5</a> and <a href="#pone-0323079-g006">6</a>.</p>
<a class="link-target" id="pone-0323079-g003" name="pone-0323079-g003"></a><div class="figure" data-doi="10.1371/journal.pone.0323079.g003"><div class="img-box"><a title="Click for larger image" href="article/figure/image?size=medium&id=10.1371/journal.pone.0323079.g003" data-doi="10.1371/journal.pone.0323079" data-uri="10.1371/journal.pone.0323079.g003"><img src="article/figure/image?size=inline&id=10.1371/journal.pone.0323079.g003" alt="thumbnail" class="thumbnail" loading="lazy"></a><div class="expand"></div></div><div class="figure-inline-download">
Download:
<ul><li><a href="article/figure/powerpoint?id=10.1371/journal.pone.0323079.g003"><div class="definition-label">PPT</div><div class="definition-description">PowerPoint slide</div></a></li><li><a href="article/figure/image?download&size=large&id=10.1371/journal.pone.0323079.g003"><div class="definition-label">PNG</div><div class="definition-description">larger image</div></a></li><li><a href="article/figure/image?download&size=original&id=10.1371/journal.pone.0323079.g003"><div class="definition-label">TIFF</div><div class="definition-description">original image</div></a></li></ul></div><div class="figcaption"><span>Fig 3. </span> Example Datavzrd view of an astronomy spreadsheet supplement of Barraud <em>et al</em>. [<a href="#pone.0323079.ref022" class="ref-tip">22</a>].</div><p class="caption_target"><a id="article1.body1.sec2.sec3.fig1.caption1.p1" name="article1.body1.sec2.sec3.fig1.caption1.p1" class="link-target"></a><p>Boolean columns have been rendered with Datavzrd’s boolean spell [<a href="#pone.0323079.ref056" class="ref-tip">56</a>], numeric columns have been rendered as heatmaps. The squarish link buttons at the far right of each row (generated by Datavzrd’s dataset linking functionality, see section Interactivity and visuals) allow to jump to corresponding rows in other views.</p>
</p><p class="caption_object"><a href="https://doi.org/10.1371/journal.pone.0323079.g003">
https://doi.org/10.1371/journal.pone.0323079.g003</a></p></div><a class="link-target" id="pone-0323079-g004" name="pone-0323079-g004"></a><div class="figure" data-doi="10.1371/journal.pone.0323079.g004"><div class="img-box"><a title="Click for larger image" href="article/figure/image?size=medium&id=10.1371/journal.pone.0323079.g004" data-doi="10.1371/journal.pone.0323079" data-uri="10.1371/journal.pone.0323079.g004"><img src="article/figure/image?size=inline&id=10.1371/journal.pone.0323079.g004" alt="thumbnail" class="thumbnail" loading="lazy"></a><div class="expand"></div></div><div class="figure-inline-download">
Download:
<ul><li><a href="article/figure/powerpoint?id=10.1371/journal.pone.0323079.g004"><div class="definition-label">PPT</div><div class="definition-description">PowerPoint slide</div></a></li><li><a href="article/figure/image?download&size=large&id=10.1371/journal.pone.0323079.g004"><div class="definition-label">PNG</div><div class="definition-description">larger image</div></a></li><li><a href="article/figure/image?download&size=original&id=10.1371/journal.pone.0323079.g004"><div class="definition-label">TIFF</div><div class="definition-description">original image</div></a></li></ul></div><div class="figcaption"><span>Fig 4. </span> Datavzrd boolean spell and its application to a gene table.</div><p class="caption_target"><a id="article1.body1.sec2.sec3.fig2.caption1.p1" name="article1.body1.sec2.sec3.fig2.caption1.p1" class="link-target"></a><p><strong>Left:</strong> Datavzrd spell for displaying boolean values of the column <span class="monospace">highly_variable</span> of the report to the right. The <span class="monospace">true_value</span> and <span class="monospace">false_value</span> parameters define which values are rendered into a plus sign and a minus sign. <strong>Right:</strong> Example Datavzrd view of a bioinformatics spreadsheet supplement of Klein <em>et al</em>. [<a href="#pone.0323079.ref020" class="ref-tip">20</a>]. Gene names have been rendered as links to a public database, boolean values have been rendered using Datavzrd’s boolean spell [<a href="#pone.0323079.ref056" class="ref-tip">56</a>] (see Community driven extensibility), other columns have been rendered as heatmaps with categorical or linear color scale.</p>
</p><p class="caption_object"><a href="https://doi.org/10.1371/journal.pone.0323079.g004">
https://doi.org/10.1371/journal.pone.0323079.g004</a></p></div><a class="link-target" id="pone-0323079-g005" name="pone-0323079-g005"></a><div class="figure" data-doi="10.1371/journal.pone.0323079.g005"><div class="img-box"><a title="Click for larger image" href="article/figure/image?size=medium&id=10.1371/journal.pone.0323079.g005" data-doi="10.1371/journal.pone.0323079" data-uri="10.1371/journal.pone.0323079.g005"><img src="article/figure/image?size=inline&id=10.1371/journal.pone.0323079.g005" alt="thumbnail" class="thumbnail" loading="lazy"></a><div class="expand"></div></div><div class="figure-inline-download">
Download:
<ul><li><a href="article/figure/powerpoint?id=10.1371/journal.pone.0323079.g005"><div class="definition-label">PPT</div><div class="definition-description">PowerPoint slide</div></a></li><li><a href="article/figure/image?download&size=large&id=10.1371/journal.pone.0323079.g005"><div class="definition-label">PNG</div><div class="definition-description">larger image</div></a></li><li><a href="article/figure/image?download&size=original&id=10.1371/journal.pone.0323079.g005"><div class="definition-label">TIFF</div><div class="definition-description">original image</div></a></li></ul></div><div class="figcaption"><span>Fig 5. </span> Example Datavzrd view of a social science spreadsheet supplement of Alayón-Gamboa <em>et al</em>. [<a href="#pone.0323079.ref021" class="ref-tip">21</a>].</div><p class="caption_target"><a id="article1.body1.sec2.sec3.fig3.caption1.p1" name="article1.body1.sec2.sec3.fig3.caption1.p1" class="link-target"></a><p>Categorical columns have been rendered as heatmaps with a categorical color scale. The squarish link buttons at the far right of each row (generated by Datavzrd’s dataset linking functionality, see section Interactivity and visuals) allow to jump to corresponding rows in other views.</p>
</p><p class="caption_object"><a href="https://doi.org/10.1371/journal.pone.0323079.g005">
https://doi.org/10.1371/journal.pone.0323079.g005</a></p></div><a class="link-target" id="pone-0323079-g006" name="pone-0323079-g006"></a><div class="figure" data-doi="10.1371/journal.pone.0323079.g006"><div class="img-box"><a title="Click for larger image" href="article/figure/image?size=medium&id=10.1371/journal.pone.0323079.g006" data-doi="10.1371/journal.pone.0323079" data-uri="10.1371/journal.pone.0323079.g006"><img src="article/figure/image?size=inline&id=10.1371/journal.pone.0323079.g006" alt="thumbnail" class="thumbnail" loading="lazy"></a><div class="expand"></div></div><div class="figure-inline-download">
Download:
<ul><li><a href="article/figure/powerpoint?id=10.1371/journal.pone.0323079.g006"><div class="definition-label">PPT</div><div class="definition-description">PowerPoint slide</div></a></li><li><a href="article/figure/image?download&size=large&id=10.1371/journal.pone.0323079.g006"><div class="definition-label">PNG</div><div class="definition-description">larger image</div></a></li><li><a href="article/figure/image?download&size=original&id=10.1371/journal.pone.0323079.g006"><div class="definition-label">TIFF</div><div class="definition-description">original image</div></a></li></ul></div><div class="figcaption"><span>Fig 6. </span> Example Datavzrd view of an anthropology spreadsheet supplement of L. G. Sanjuán <em>et al</em>. [<a href="#pone.0323079.ref019" class="ref-tip">19</a>].</div><p class="caption_target"><a id="article1.body1.sec2.sec3.fig4.caption1.p1" name="article1.body1.sec2.sec3.fig4.caption1.p1" class="link-target"></a><p>Numerical values have been rendered as tick plots or heatmaps. Categorical columns have been rendered as heatmaps with categorical color scale.</p>
</p><p class="caption_object"><a href="https://doi.org/10.1371/journal.pone.0323079.g006">
https://doi.org/10.1371/journal.pone.0323079.g006</a></p></div></div>
<div id="section4" class="section toc-section"><a id="sec006" name="sec006" class="link-target" title="Memory and storage footprint"></a>
<h3>Memory and storage footprint</h3>
<a id="article1.body1.sec2.sec4.p1" name="article1.body1.sec2.sec4.p1" class="link-target"></a><p>We evaluated the storage utilization of <em>Datavzrd</em> reports in comparison to the raw input data and an Excel file. The analysis has been implemented as a fully reproducible Snakemake [<a href="#pone.0323079.ref005" class="ref-tip">5</a>] workflow [<a href="#pone.0323079.ref047" class="ref-tip">47</a>]. Our dataset [<a href="#pone.0323079.ref048" class="ref-tip">48</a>] used for testing comprises 17 columns and 173534 rows with information about registered electric vehicles in the state of Washington. Seven of the columns contained numeric, ten contained nominal values.</p>
<a id="article1.body1.sec2.sec4.p2" name="article1.body1.sec2.sec4.p2" class="link-target"></a><p>In <a href="#pone-0323079-g007">Fig 7</a>, we compare the on disk storage footprint of two <em>Datavzrd</em> reports (one that represents the dataset entirely in memory and one that uses data partitioning for the same dataset) with the footprint of the CSV and Excel representation of the same dataset. One can see that the <em>Datavzrd</em> in-memory report occupies nearly as little space as the plain Excel file, while being (naturally) much smaller than the plain text CSV representation. Further, it can be seen that a bit less than half of the size is occupied by static resources like Javascript libraries and HTML pages. In contrast, the partitioned version of the report requires additional overhead for storing search indices and suffers from decreased compression rates, because each table page has to be compressed separately.</p>
<a class="link-target" id="pone-0323079-g007" name="pone-0323079-g007"></a><div class="figure" data-doi="10.1371/journal.pone.0323079.g007"><div class="img-box"><a title="Click for larger image" href="article/figure/image?size=medium&id=10.1371/journal.pone.0323079.g007" data-doi="10.1371/journal.pone.0323079" data-uri="10.1371/journal.pone.0323079.g007"><img src="article/figure/image?size=inline&id=10.1371/journal.pone.0323079.g007" alt="thumbnail" class="thumbnail" loading="lazy"></a><div class="expand"></div></div><div class="figure-inline-download">
Download:
<ul><li><a href="article/figure/powerpoint?id=10.1371/journal.pone.0323079.g007"><div class="definition-label">PPT</div><div class="definition-description">PowerPoint slide</div></a></li><li><a href="article/figure/image?download&size=large&id=10.1371/journal.pone.0323079.g007"><div class="definition-label">PNG</div><div class="definition-description">larger image</div></a></li><li><a href="article/figure/image?download&size=original&id=10.1371/journal.pone.0323079.g007"><div class="definition-label">TIFF</div><div class="definition-description">original image</div></a></li></ul></div><div class="figcaption"><span>Fig 7. </span> Storage usage of Datavzrd reports compared with Excel and raw input data.</div><p class="caption_target"></p><p class="caption_object"><a href="https://doi.org/10.1371/journal.pone.0323079.g007">
https://doi.org/10.1371/journal.pone.0323079.g007</a></p></div><a id="article1.body1.sec2.sec4.p3" name="article1.body1.sec2.sec4.p3" class="link-target"></a><p>While it is apparent that both Excel and <em>Datavzrd</em> are able to successfully compress the dataset, <a href="#pone-0323079-g007">Fig 7</a> indicates that compression rates of <em>Datavzrd</em> depend on the amount of table rows that can be compressed together (i.e. the page size or whether the entire dataset is held in memory). <a href="#pone-0323079-g008">Fig 8</a> shows that the compression rate for the in-memory mode of <em>Datavzrd</em> exceeds that of Excel, while smaller page sizes lead to a monotone decrease of compression rates.</p>
<a class="link-target" id="pone-0323079-g008" name="pone-0323079-g008"></a><div class="figure" data-doi="10.1371/journal.pone.0323079.g008"><div class="img-box"><a title="Click for larger image" href="article/figure/image?size=medium&id=10.1371/journal.pone.0323079.g008" data-doi="10.1371/journal.pone.0323079" data-uri="10.1371/journal.pone.0323079.g008"><img src="article/figure/image?size=inline&id=10.1371/journal.pone.0323079.g008" alt="thumbnail" class="thumbnail" loading="lazy"></a><div class="expand"></div></div><div class="figure-inline-download">
Download:
<ul><li><a href="article/figure/powerpoint?id=10.1371/journal.pone.0323079.g008"><div class="definition-label">PPT</div><div class="definition-description">PowerPoint slide</div></a></li><li><a href="article/figure/image?download&size=large&id=10.1371/journal.pone.0323079.g008"><div class="definition-label">PNG</div><div class="definition-description">larger image</div></a></li><li><a href="article/figure/image?download&size=original&id=10.1371/journal.pone.0323079.g008"><div class="definition-label">TIFF</div><div class="definition-description">original image</div></a></li></ul></div><div class="figcaption"><span>Fig 8. </span> Comparison of compression rates for increasing input sizes and different page sizes.</div><p class="caption_target"></p><p class="caption_object"><a href="https://doi.org/10.1371/journal.pone.0323079.g008">
https://doi.org/10.1371/journal.pone.0323079.g008</a></p></div></div>
</div>
<div xmlns:plos="http://plos.org" id="section3" class="section toc-section"><a id="sec007" name="sec007" data-toc="sec007" class="link-target" title="Methods"></a><h2>Methods</h2><a id="article1.body1.sec3.p1" name="article1.body1.sec3.p1" class="link-target"></a><p>We shed light on the central technical challenges and solutions within <em>Datavzrd</em> by considering portability, interactivity and scalability.</p>
<div id="section1" class="section toc-section"><a id="sec008" name="sec008" class="link-target" title="Portability"></a>
<h3>Portability</h3>
<a id="article1.body1.sec3.sec1.p1" name="article1.body1.sec3.sec1.p1" class="link-target"></a><p>In the context of scientific research, seamless data exchange among researchers is a key factor for collaborative progress. With this in mind, <em>Datavzrd</em> implements various features targeting a high portability of the resulting reports.</p>
<a id="article1.body1.sec3.sec1.p2" name="article1.body1.sec3.sec1.p2" class="link-target"></a><p>A key feature of <em>Datavzrd</em> is a self-contained report architecture — eliminating the need for a dedicated backend or server. The entire report, structured as HTML files in a regular folder, is platform-agnostic, offering compatibility across all operating systems.</p>
<a id="article1.body1.sec3.sec1.p3" name="article1.body1.sec3.sec1.p3" class="link-target"></a><p>Browsers subject HTML pages to the same-origin-policy [<a href="#pone.0323079.ref008" class="ref-tip">8</a>], which prohibits them from dynamically accessing resources hosted on domains other than their own. In case of standalone HTML pages that are accessed from the file system instead of being provided by a web server, this implies that the page may only access local files via static HTML tags. Hence it becomes impossible to dynamically load data stored in binary formats such as HDF5 [<a href="#pone.0323079.ref049" class="ref-tip">49</a>], Parquet [<a href="#pone.0323079.ref037" class="ref-tip">37</a>], or Flatbuffers [<a href="#pone.0323079.ref051" class="ref-tip">51</a>], as well as to directly access databases like SQLite [<a href="#pone.0323079.ref052" class="ref-tip">52</a>] or DuckDB [<a href="#pone.0323079.ref050" class="ref-tip">50</a>]. To work around this limitation, <em>Datavzrd</em> stores data in JavaScript files, which are then loaded via static script tags. This approach requires regenerating the report whenever the input dataset changes; however, because data and configuration are completely separated, no updates to the latter are needed as long as the structure of the data remains unchanged. We recommend embedding the invocation of <em>Datavzrd</em> into automated workflows (e.g., using Snakemake [<a href="#pone.0323079.ref005" class="ref-tip">5</a>], Nextflow [<a href="#pone.0323079.ref024" class="ref-tip">24</a>], or CWL [<a href="#pone.0323079.ref025" class="ref-tip">25</a>]) to facilitate reproducible report generation after data updates.</p>
<a id="article1.body1.sec3.sec1.p4" name="article1.body1.sec3.sec1.p4" class="link-target"></a><p>In addition to sharing full reports, <em>Datavzrd</em> provides a share button for each row, enabling to share individual rows of a dataset with others. This is solved by encoding the row data into a URL parameter. The URL directs the user to a website hosted on GitHub that can display the exchanged dataset row by reading the URL parameter. Since the row data is in theory discoverable from URL parameters that might occur in server logs, the base URL of the HTML page can be customized through the configuration file, allowing organizations to ensure that sensitive data remains within their local network by hosting the previously mentioned HTML page themselves. <em>Datavzrd</em> can also encode this URL into a QR code, providing a practical method for presenters to share data during presentations.</p>
<a id="article1.body1.sec3.sec1.p5" name="article1.body1.sec3.sec1.p5" class="link-target"></a><p>Individual pages of the report can be exported into SVG format, for example in order to embed them into manuscript figures. Additionally, <em>Datavzrd</em> reports offer an export to Excel (XLSX). This way, they can serve as replacement for sharing spreadsheets without hampering the ability of collaborators to further analyze aspects of the data in their traditional spreadsheet environment.</p>
</div>
<div id="section2" class="section toc-section"><a id="sec009" name="sec009" class="link-target" title="Interactivity and visuals"></a>
<h3>Interactivity and visuals</h3>
<a id="article1.body1.sec3.sec2.p1" name="article1.body1.sec3.sec2.p1" class="link-target"></a><p>The most obvious kind of interaction with a table is to filter or search for rows of interest. Depending on whether the dataset is small enough to reside entirely in memory or not, <em>Datavzrd</em> offers either a filter or a search mode. The filter mode presents a widget for each column, which, depending on the type of data in the column, either allows to choose from discrete values, specify a search keyword, or select a numeric range. The widgets of the filter mode, along with the search mode, are displayed in <a href="#pone-0323079-g009">Fig 9</a>. Filters for different columns can be combined, yielding the intersection of the resulting rows. For a synthetic dataset with 100,000 rows and 30 columns (including nominal, integer, and string-valued columns), interactive filtering operations consistently complete in under 100 ms. Measurements were taken using the browser’s <span class="monospace">performance.now()</span> API in Safari 18.5 on macOS 13.7.6 with a 3.8 GHz Quad-Core Intel Core i5 and 48 GB of RAM. The search mode (due to constraints in the possibilities of representing large datasets out of memory in standalone HTML files) offers the ability to search for keywords or numbers and subsequently jump to the corresponding pages of the table, see section Scalability.</p>
<a class="link-target" id="pone-0323079-g009" name="pone-0323079-g009"></a><div class="figure" data-doi="10.1371/journal.pone.0323079.g009"><div class="img-box"><a title="Click for larger image" href="article/figure/image?size=medium&id=10.1371/journal.pone.0323079.g009" data-doi="10.1371/journal.pone.0323079" data-uri="10.1371/journal.pone.0323079.g009"><img src="article/figure/image?size=inline&id=10.1371/journal.pone.0323079.g009" alt="thumbnail" class="thumbnail" loading="lazy"></a><div class="expand"></div></div><div class="figure-inline-download">
Download:
<ul><li><a href="article/figure/powerpoint?id=10.1371/journal.pone.0323079.g009"><div class="definition-label">PPT</div><div class="definition-description">PowerPoint slide</div></a></li><li><a href="article/figure/image?download&size=large&id=10.1371/journal.pone.0323079.g009"><div class="definition-label">PNG</div><div class="definition-description">larger image</div></a></li><li><a href="article/figure/image?download&size=original&id=10.1371/journal.pone.0323079.g009"><div class="definition-label">TIFF</div><div class="definition-description">original image</div></a></li></ul></div><div class="figcaption"><span>Fig 9. </span> Comparison of search and filter mode (text input, filter brush or multi-select).</div><p class="caption_target"></p><p class="caption_object"><a href="https://doi.org/10.1371/journal.pone.0323079.g009">
https://doi.org/10.1371/journal.pone.0323079.g009</a></p></div><a id="article1.body1.sec3.sec2.p2" name="article1.body1.sec3.sec2.p2" class="link-target"></a><p>In practice, data can often be best represented by multiple tabular datasets that are related to each other. It may even be beneficial to divide wider tables into multiple ones, each containing a specific subset of columns [<a href="#pone.0323079.ref010" class="ref-tip">10</a>]. Therefore, <em>Datavzrd</em> offers the capability to link between datasets, allowing the user to jump back and forth between corresponding rows of related tables.</p>
<a id="article1.body1.sec3.sec2.p3" name="article1.body1.sec3.sec2.p3" class="link-target"></a><p>The configuration of the datasets allows for the values of any column to be used as <em>foreign keys</em> to create a link to a row of another dataset with one column configured to be used as the <em>primary key</em>. Each <em>primary key</em> value must only occur once in the linked dataset to preserve uniqueness of the key lookup.</p>
<a id="article1.body1.sec3.sec2.p4" name="article1.body1.sec3.sec2.p4" class="link-target"></a><p>The same mechanism enables hierarchical linking by utilizing values from one column as foreign keys to connect with different tables. This feature allows for concise overview tables to establish connections with more detailed subtables, enhancing the exploration of specific details within the given data without requiring the entire hierarchical structure to be present in browser memory. An example for a dataset definition using both linking options is provided in <a href="#pone-0323079-g010">Fig 10</a>.</p>
<a class="link-target" id="pone-0323079-g010" name="pone-0323079-g010"></a><div class="figure" data-doi="10.1371/journal.pone.0323079.g010"><div class="img-box"><a title="Click for larger image" href="article/figure/image?size=medium&id=10.1371/journal.pone.0323079.g010" data-doi="10.1371/journal.pone.0323079" data-uri="10.1371/journal.pone.0323079.g010"><img src="article/figure/image?size=inline&id=10.1371/journal.pone.0323079.g010" alt="thumbnail" class="thumbnail" loading="lazy"></a><div class="expand"></div></div><div class="figure-inline-download">
Download:
<ul><li><a href="article/figure/powerpoint?id=10.1371/journal.pone.0323079.g010"><div class="definition-label">PPT</div><div class="definition-description">PowerPoint slide</div></a></li><li><a href="article/figure/image?download&size=large&id=10.1371/journal.pone.0323079.g010"><div class="definition-label">PNG</div><div class="definition-description">larger image</div></a></li><li><a href="article/figure/image?download&size=original&id=10.1371/journal.pone.0323079.g010"><div class="definition-label">TIFF</div><div class="definition-description">original image</div></a></li></ul></div><div class="figcaption"><span>Fig 10. </span> A Datavzrd dataset definition including different linkouts.</div><p class="caption_target"><a id="article1.body1.sec3.sec2.fig2.caption1.p1" name="article1.body1.sec3.sec2.fig2.caption1.p1" class="link-target"></a><p>In this example, <span class="monospace">table-a</span> creates a link to <span class="monospace">table-b</span> where column <span class="monospace">gene-name</span> of <span class="monospace">table-a</span> and column <span class="monospace">gene</span> of <span class="monospace">table-b</span> match in value. With the <span class="monospace">gene details</span> definition, <span class="monospace">table-a</span> is linked to one of many tables existing for each value of <span class="monospace">gene-name</span>.</p>
</p><p class="caption_object"><a href="https://doi.org/10.1371/journal.pone.0323079.g010">
https://doi.org/10.1371/journal.pone.0323079.g010</a></p></div><a id="article1.body1.sec3.sec2.p5" name="article1.body1.sec3.sec2.p5" class="link-target"></a><p>Columns in <em>Datavzrd</em> reports can be displayed in different modes: <span class="monospace">normal</span>, <span class="monospace">detail</span>, <span class="monospace">available</span>, <span class="monospace">pinned</span>, and <span class="monospace">hidden</span>. These modes are designed to address the challenge of maintaining clarity while accommodating a large amount of data. Research indicates that an ideal table typically contains 3-5 columns to ensure readability and prevent information overload [<a href="#pone.0323079.ref011" class="ref-tip">11</a>]. While the exact number of columns will depend on their information content and the context of the table (on paper or on screen), <em>Datavzrd’s</em> display modes offer the ability to follow these guidelines easily. In particular, the <span class="monospace">hidden</span> mode allows for complete concealment of less critical columns, thereby keeping the table concise and focused. Meanwhile, the <span class="monospace">detail</span> mode enables selective unfolding of additional columns per row as needed, allowing users to access more comprehensive data without compromising the table’s clarity. Using <span class="monospace">available</span> hides a column by default while still providing the user with the option to reveal it using a multi-select column interface on the top right when exploring the dataset. Complementary to this, <span class="monospace">pinned</span> keeps the column visible in the table but excludes it from the interface, preventing it from being accidentally hidden and reducing clutter in the selection interface.</p>
<a id="article1.body1.sec3.sec2.p6" name="article1.body1.sec3.sec2.p6" class="link-target"></a><p>Guidelines for effective tables find that column headers should be kept short or use abbreviations [<a href="#pone.0323079.ref012" class="ref-tip">12</a>]. This is possible using the <span class="monospace">label</span> keyword allowing to specify column labels for the resulting report without the need to modify the given input dataset. To make tables self-explanatory, the <span class="monospace">description</span> keyword can be used to provide additional information and context [<a href="#pone.0323079.ref012" class="ref-tip">12</a>]. This keyword supports Markdown-formatted text [<a href="#pone.0323079.ref013" class="ref-tip">13</a>] as well as LaTeX-style math equations, enabling the report creator to include detailed and complex annotations, ensuring the table can be understood by any observer. Additionally, <em>Datavzrd</em> provides the option to set a character limit for a column using the <span class="monospace">ellipsis</span> keyword. This only shows the first <em>n</em> characters in the cell with the rest still accessible via a tooltip that appears while hovering the cell. External resources like knowledge databases can provide additional context with even more details to researchers. For easy access to external resources, <em>Datavzrd</em> provides the option to configure one or more linkouts for a cell using the value of the cell or other values of the same row to format the URL.</p>
<a id="article1.body1.sec3.sec2.p7" name="article1.body1.sec3.sec2.p7" class="link-target"></a><p>Datavzrd relies on Vega-Lite as its underlying engine for generating a wide variety of plots [<a href="#pone.0323079.ref003" class="ref-tip">3</a>]. Internally, Vega-Lite specifications compile to Vega, which itself builds on D3.js for rendering. Datavzrd provides an even higher level of abstraction with its available pre-made plot configurations for <span class="monospace">ticks</span>, <span class="monospace">bars</span>, <span class="monospace">pills</span> and <span class="monospace">heatmaps</span>. When specified for a column (cf. <a href="#pone-0323079-g011">Fig 11</a>), these visualizations are automatically applied and configured to every cell within that column. Extending the existing plot configurations, <em>Datavzrd</em> also allows to include Vega-Lite plots that can be fully customized through JSON specifications, allowing researchers the flexibility to create visuals tailored to their specific needs and preferences. Through this mechanism, users can harness the full expressiveness of Vega-Lite, which supports a wide range of visualizations such as scatter plots, line and area charts, bar charts, heatmaps, geographic maps and faceted layouts (see <a href="https://vega.github.io/vega-lite/examples/">examples</a> for the extensive set of supported types). If neither of the previously mentioned options is suitable for a given task, configurations of columns may include any javascript function to process data and return plain HTML that is rendered into the respective table cell.</p>
<a class="link-target" id="pone-0323079-g011" name="pone-0323079-g011"></a><div class="figure" data-doi="10.1371/journal.pone.0323079.g011"><div class="img-box"><a title="Click for larger image" href="article/figure/image?size=medium&id=10.1371/journal.pone.0323079.g011" data-doi="10.1371/journal.pone.0323079" data-uri="10.1371/journal.pone.0323079.g011"><img src="article/figure/image?size=inline&id=10.1371/journal.pone.0323079.g011" alt="thumbnail" class="thumbnail" loading="lazy"></a><div class="expand"></div></div><div class="figure-inline-download">
Download:
<ul><li><a href="article/figure/powerpoint?id=10.1371/journal.pone.0323079.g011"><div class="definition-label">PPT</div><div class="definition-description">PowerPoint slide</div></a></li><li><a href="article/figure/image?download&size=large&id=10.1371/journal.pone.0323079.g011"><div class="definition-label">PNG</div><div class="definition-description">larger image</div></a></li><li><a href="article/figure/image?download&size=original&id=10.1371/journal.pone.0323079.g011"><div class="definition-label">TIFF</div><div class="definition-description">original image</div></a></li></ul></div><div class="figcaption"><span>Fig 11. </span> Different pre-defined column visualizations of Datavzrd.</div><p class="caption_target"><a id="article1.body1.sec3.sec2.fig3.caption1.p1" name="article1.body1.sec3.sec2.fig3.caption1.p1" class="link-target"></a><p><strong>Left</strong>: corresponding YAML specification in the configuration file. <strong>Right</strong>: resulting column visualization. <strong>A</strong>: A <em>Datavzrd</em> tick plot definition with user-defined domain. <strong>B</strong>: A <em>Datavzrd</em> bar plot definition with user-defined domain and additional color domain. <strong>C</strong>: A <em>Datavzrd</em> heatmap for a column named <span class="monospace">Rated</span>. <strong>D</strong>: Pill plot definition for a cell containing multiple values separated by any delimiter. <strong>E</strong>: YAML specification of a linkout to the NCBI gene database.</p>
</p><p class="caption_object"><a href="https://doi.org/10.1371/journal.pone.0323079.g011">
https://doi.org/10.1371/journal.pone.0323079.g011</a></p></div><a id="article1.body1.sec3.sec2.p8" name="article1.body1.sec3.sec2.p8" class="link-target"></a><p>By using Vega-Lite plots, users can not only specify custom plots using values of a single row to display inside a table but also harness the entire dataset to craft plots that convey meaningful insights independently of the tabular view and stand as a single view inside the report. Full plot views in <em>Datavzrd</em> retain the previously introduced linking feature for datasets, enabling users to click on data points within a plot for navigating to corresponding rows of complementary tables.</p>
<a id="article1.body1.sec3.sec2.p9" name="article1.body1.sec3.sec2.p9" class="link-target"></a><p>Finally, beyond tabular and plot views, <em>Datavzrd</em> offers the possibility to configure plain HTML views, allowing to embed any kind of custom interface or visualization.</p>
</div>
<div id="section3" class="section toc-section"><a id="sec010" name="sec010" class="link-target" title="Scalability"></a>
<h3>Scalability</h3>
<a id="article1.body1.sec3.sec3.p1" name="article1.body1.sec3.sec3.p1" class="link-target"></a><p>For ensuring scalability towards big datasets, <em>Datavzrd</em> uses a combination of different compression techniques. Initially, the data is compressed using JSONM [<a href="#pone.0323079.ref053" class="ref-tip">53</a>]. JSONM uses memoization principles on JSON objects in order to eliminate any unnecessary repetition of data. In particular, it stores keys only once, such that objects of the same kind can be represented via arrays of values. The JSONM representation is then compressed with lz-string [<a href="#pone.0323079.ref054" class="ref-tip">54</a>], a JavaScript library that implements Lempel-Ziv compression algorithms while ensuring that the resulting compressed word can be represented as a Javascript string (thus not containing any invalid binary only characters).</p>
<a id="article1.body1.sec3.sec3.p2" name="article1.body1.sec3.sec3.p2" class="link-target"></a><p>Any tabular dataset encoded by the above approach will, upon rendering the report’s HTML pages, still be represented in uncompressed form in the browser memory. If the uncompressed dataset size exceeds the available system memory this can lead to slowdowns or crashes. In order to avoid this situation, <em>Datavzrd</em> partitions large datasets into multiple chunks, each of them being only loaded when the corresponding table page in the report is accessed. The threshold for and size of these chunks can be configured upon report generation (default: 20000 rows). Since those chunks cannot be loaded dynamically due to the same-origin-policy, we encode each table page as a separate HTML file. Page sizes may be configured by the user to address variations in performance across different machines and account for datasets with differing numbers of columns.</p>
<a id="article1.body1.sec3.sec3.p3" name="article1.body1.sec3.sec3.p3" class="link-target"></a><p>Searching throughout such chunked datasets, paginated across multiple HTML pages, presents a challenge as direct access to these pages is restricted by the same-origin-policy. To overcome this limitation, <em>Datavzrd</em> implements a pre-built search index for each column, providing an effective solution for search and navigation across the distributed dataset. The index includes the values of each column alongside their respective page locations, and is displayed upon request using an embedded iframe. This way, we avoid that the indexes of all columns are loaded entirely into memory when rendering a page. Within the index table, the user can filter for values of interest, such that the pages of occurrence are displayed and can be navigated to. Upon the latter, the row corresponding to the value of interest is highlighted.</p>
<a id="article1.body1.sec3.sec3.p4" name="article1.body1.sec3.sec3.p4" class="link-target"></a><p>If the dataset is small enough to fit entirely into memory, <em>Datavzrd</em> can instead rely on a versatile filtering mechanism which enables to dynamically select and combine data ranges across multiple columns.</p>
</div>
</div>
<div xmlns:plos="http://plos.org" id="section4" class="section toc-section"><a id="sec011" name="sec011" data-toc="sec011" class="link-target" title="Conclusion"></a><h2>Conclusion</h2><a id="article1.body1.sec4.p1" name="article1.body1.sec4.p1" class="link-target"></a><p>Tabular data, often scattered across multiple tables, is the primary output of data analyses in virtually all scientific fields. Exchange and communication of tabular data is therefore a central challenge in data science. So far, this has been mostly handled by spreadsheet applications like Microsoft Excel - offering limited visual and interactive capabilities as well as potential problems with compatibility, replicability and value encoding [<a href="#pone.0323079.ref004" class="ref-tip">4</a>] - or server based approaches like R Shiny, Lumen or dedicated web applications, requiring maintenance of web servers and potentially extensive imperative programming while limiting sustainability and reproducibility upon publication.</p>
<a id="article1.body1.sec4.p2" name="article1.body1.sec4.p2" class="link-target"></a><p>To overcome this situation, we have developed <em>Datavzrd</em>, which unifies rich visual capabilities with the portability offered by plain spreadsheets. It enables the generation of server-free, portable, interactive visual reports on tabular data that can be rapidly configured via a declarative specification language, in many cases obviating the need for imperative programming. Once a configuration file is created, <em>Datavzrd</em> can be repeatedly applied to various datasets of the same structure, offering automated, efficient, and scalable table visualization. Linking features, various display modes, extensive visualization capabilities, and the ability to specify fully custom non-tabular views, simplify structured dataset exploration, even across multiple related tables. <em>Datavzrd’s</em> versatile export functionalities offer straightforward inclusion into manuscript figures. Via <em>spells</em>, custom column or view configurations can be shared and developed as a community project.</p>
<a id="article1.body1.sec4.p3" name="article1.body1.sec4.p3" class="link-target"></a><p>Future work on <em>Datavzrd</em> will entail a further improvement of the data compression and decompression strategy. One approach is to directly compress binary encoded JSONM with lz-string. Given that a machine independent decoding of the binary encoding from within Javascript can be realized, this approach would provide a substantial further reduction of the space required for numeric values. Furthermore, we plan to extend support to additional data types, such as temporal data. Currently, <em>Datavzrd</em> can already be integrated into other standalone reporting tools like for example Snakemake reports. Using web components [<a href="#pone.0323079.ref055" class="ref-tip">55</a>], we plan to generalize the user interface so that its components can be embedded into arbitrary web application frameworks. Currently, <em>Datavzrd</em>’s aggregation capabilities are limited to simple, per-column summaries such as histograms. More complex operations like window functions or pivot tables are not supported. We see this as a deliberate design choice: such aggregations are better handled upstream in the analysis workflow [<a href="#pone.0323079.ref005" class="ref-tip">5</a>,<a href="#pone.0323079.ref024" class="ref-tip">24</a>,<a href="#pone.0323079.ref025" class="ref-tip">25</a>], where they can be executed transparently and reproducibly. In future versions, we plan to extend Datavzrd with lightweight interactive features such as scatterplots for user-selected column pairs.</p>
<a id="article1.body1.sec4.p4" name="article1.body1.sec4.p4" class="link-target"></a><p>In summary, <em>Datavzrd</em> streamlines, simplifies, and enriches the exchange and communication of tabular data, one of the most abundant outputs of scientific data analyses, while providing seamless scaling from small tables to thousands or even millions of rows without losing the ability of interactive and visually rich exploration. All these capabilities can be used on any kind of tabular data, and the resulting reports can be used as supplementary files for published manuscripts, or shared with collaborating researchers before publication. This enables the collaborators and readers to interactively explore the data underlying the findings of an analysis or published manuscript directly in their web browser without imposing additional maintenance or implementation burdens to the analysis authors. Likewise, it enables journals or scientific data hosting services like Zenodo [<a href="#pone.0323079.ref001" class="ref-tip">1</a>] to sustainably ensure the availability of also the interactive resources associated with a manuscript by simply hosting a set of static HTML files instead of requiring the maintenance of server processes.</p>
</div>
<div xmlns:plos="http://plos.org" id="section5" class="section toc-section"><a id="sec012" name="sec012" data-toc="sec012" class="link-target" title="Software availability"></a><h2>Software availability</h2><a id="article1.body1.sec5.p1" name="article1.body1.sec5.p1" class="link-target"></a><p><em>Datavzrd</em> is implemented as a command line application with the <em>Rust</em> [<a href="#pone.0323079.ref032" class="ref-tip">32</a>] programming language. It is available as an MIT licensed open source software via <em>Github</em> [<a href="#pone.0323079.ref033" class="ref-tip">33</a>], can be installed via <em>Cargo</em> [<a href="#pone.0323079.ref034" class="ref-tip">34</a>] and <em>Conda</em> [<a href="#pone.0323079.ref035" class="ref-tip">35</a>] or used as a <em>Snakemake</em> wrapper [<a href="#pone.0323079.ref036" class="ref-tip">36</a>] for rapid integration into reproducible data analysis workflows.</p>
</div>
<div xmlns:plos="http://plos.org" id="section6" class="section toc-section"><a id="sec013" name="sec013" data-toc="sec013" class="link-target" title="Supporting information"></a><h2>Supporting information</h2><div class="figshare_widget" doi="10.1371/journal.pone.0323079"></div><div class="supplementary-material"><a name="pone.0323079.s001" id="pone.0323079.s001" class="link-target"></a><h3 class="siTitle title-small"><a href="article/file?type=supplementary&id=10.1371/journal.pone.0323079.s001">S1 Appendix. </a>Comparison of Shiny and Datavzrd for Interactive Table Creation.</h3><a id="article1.body1.sec6.supplementary-material1.caption1.p1" name="article1.body1.sec6.supplementary-material1.caption1.p1" class="link-target"></a><p class="preSiDOI">We illustrate how Datavzrd supports rich, per-cell visualizations using Vega-Lite and compare its concise, declarative configuration against a minimal Shiny implementation. Example configurations, rendered outputs, and setup instructions are provided for both tools.</p>
<p class="siDoi"><a href="https://doi.org/10.1371/journal.pone.0323079.s001">https://doi.org/10.1371/journal.pone.0323079.s001</a></p><a id="article1.body1.sec6.supplementary-material1.caption1.p2" name="article1.body1.sec6.supplementary-material1.caption1.p2" class="link-target"></a><p class="postSiDOI">(PDF)</p>
</div><div class="supplementary-material"><a name="pone.0323079.s002" id="pone.0323079.s002" class="link-target"></a><h3 class="siTitle title-small"><a href="article/file?type=supplementary&id=10.1371/journal.pone.0323079.s002">S2 File. </a>Example report for Fig 2.</h3><a id="article1.body1.sec6.supplementary-material2.caption1.p1" name="article1.body1.sec6.supplementary-material2.caption1.p1" class="link-target"></a><p class="preSiDOI">Interactive Datavzrd report showcasing genomic variants with associated scores and predictions in a molecular tumor board context. The dataset has been de-identified by altering gene names and coordinates; see the original workflow at <a href="https://github.com/snakemake-workflows/dna-seq-varlociraptor">https://github.com/snakemake-workflows/dna-seq-varlociraptor</a> and explore the interactive report at <a href="https://datavzrd.github.io/example-molecular-tumor-board">https://datavzrd.github.io/example-molecular-tumor-board</a>.</p>
<p class="siDoi"><a href="https://doi.org/10.1371/journal.pone.0323079.s002">https://doi.org/10.1371/journal.pone.0323079.s002</a></p><a id="article1.body1.sec6.supplementary-material2.caption1.p2" name="article1.body1.sec6.supplementary-material2.caption1.p2" class="link-target"></a><p class="postSiDOI">(ZIP)</p>
</div></div>
<div xmlns:plos="http://plos.org" class="section toc-section"><a id="ack" name="ack" data-toc="ack" title="Acknowledgments" class="link-target"></a><h2>Acknowledgments</h2>
<a id="article1.back1.ack1.p1" name="article1.back1.ack1.p1" class="link-target"></a><p>We thank everyone who contributed by opening issues or submitting pull requests to <em>Datavzrd</em>. Although not listed as co-authors, their input helped refine the software and is acknowledged with appreciation.</p>
</div><div xmlns:plos="http://plos.org" class="toc-section"><a id="references" name="references" class="link-target" data-toc="references" title="References"></a><h2>References</h2><ol class="references"><li id="ref1"><span class="order">1.
</span><a name="pone.0323079.ref001" id="pone.0323079.ref001" class="link-target"></a>European Organization for Nuclear Research, OpenAIRE. Zenodo. 2013. <a href="https://www.zenodo.org/">https://www.zenodo.org/</a> <ul class="reflinks"><li><a href="#" data-author="" data-cit="European%20Organization%20for%20Nuclear%20Research%2C%20OpenAIRE.%20Zenodo.%202013.%20https%3A%2F%2Fwww.zenodo.org%2F" data-title="" target="_new" title="Go to article in CrossRef">
View Article
</a></li><li><a href="http://scholar.google.com/scholar?q=++" target="_new" title="Go to article in Google Scholar">
Google Scholar
</a></li></ul></li><li id="ref2"><span class="order">2.
</span><a name="pone.0323079.ref002" id="pone.0323079.ref002" class="link-target"></a>Ewels P, Magnusson M, Lundin S, Käller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016;32(19):3047–8. pmid:27312411 <ul class="reflinks" data-doi="10.1093/bioinformatics/btw354"><li><a href="https://doi.org/10.1093/bioinformatics/btw354" data-author="doi-provided" data-cit="doi-provided" data-title="doi-provided" target="_new" title="Go to article">
View Article
</a></li><li><a href="http://www.ncbi.nlm.nih.gov/pubmed/27312411" target="_new" title="Go to article in PubMed">
PubMed/NCBI
</a></li><li><a href="http://scholar.google.com/scholar?q=MultiQC%3A+summarize+analysis+results+for+multiple+tools+and+samples+in+a+single+report+Ewels+2016" target="_new" title="Go to article in Google Scholar">
Google Scholar
</a></li></ul></li><li id="ref3"><span class="order">3.
</span><a name="pone.0323079.ref003" id="pone.0323079.ref003" class="link-target"></a>Satyanarayan A, Moritz D, Wongsuphasawat K, Heer J. Vega-lite: a grammar of interactive graphics. IEEE Trans Vis Comput Graph. 2017;23(1):341–50. pmid:27875150 <ul class="reflinks" data-doi="10.1109/TVCG.2016.2599030"><li><a href="https://doi.org/10.1109/TVCG.2016.2599030" data-author="doi-provided" data-cit="doi-provided" data-title="doi-provided" target="_new" title="Go to article">
View Article
</a></li><li><a href="http://www.ncbi.nlm.nih.gov/pubmed/27875150" target="_new" title="Go to article in PubMed">
PubMed/NCBI
</a></li><li><a href="http://scholar.google.com/scholar?q=Vega-lite%3A+a+grammar+of+interactive+graphics+Satyanarayan+2017" target="_new" title="Go to article in Google Scholar">
Google Scholar
</a></li></ul></li><li id="ref4"><span class="order">4.
</span><a name="pone.0323079.ref004" id="pone.0323079.ref004" class="link-target"></a>Abeysooriya M, Soria M, Kasu MS, Ziemann M. Gene name errors: lessons not learned. PLoS Comput Biol. 2021;17(7):e1008984. pmid:34329294 <ul class="reflinks" data-doi="10.1371/journal.pcbi.1008984"><li><a href="https://doi.org/10.1371/journal.pcbi.1008984" data-author="doi-provided" data-cit="doi-provided" data-title="doi-provided" target="_new" title="Go to article">
View Article
</a></li><li><a href="http://www.ncbi.nlm.nih.gov/pubmed/34329294" target="_new" title="Go to article in PubMed">
PubMed/NCBI
</a></li><li><a href="http://scholar.google.com/scholar?q=Gene+name+errors%3A+lessons+not+learned+Abeysooriya+2021" target="_new" title="Go to article in Google Scholar">
Google Scholar
</a></li></ul></li><li id="ref5"><span class="order">5.
</span><a name="pone.0323079.ref005" id="pone.0323079.ref005" class="link-target"></a>Mölder F, Jablonski KP, Letcher B, Hall MB, Tomkins-Tinch CH, Sochat V, et al. Sustainable data analysis with Snakemake. F1000Res. 2021;10:33. pmid:34035898 <ul class="reflinks" data-doi="10.12688/f1000research.29032.2"><li><a href="https://doi.org/10.12688/f1000research.29032.2" data-author="doi-provided" data-cit="doi-provided" data-title="doi-provided" target="_new" title="Go to article">
View Article
</a></li><li><a href="http://www.ncbi.nlm.nih.gov/pubmed/34035898" target="_new" title="Go to article in PubMed">
PubMed/NCBI
</a></li><li><a href="http://scholar.google.com/scholar?q=Sustainable+data+analysis+with+Snakemake+M%C3%B6lder+2021" target="_new" title="Go to article in Google Scholar">
Google Scholar
</a></li></ul></li><li id="ref6"><span class="order">6.
</span><a name="pone.0323079.ref006" id="pone.0323079.ref006" class="link-target"></a>Broman KW, Woo KH. Data organization in spreadsheets. Am Statist. 2018;72(1):2–10. <ul class="reflinks" data-doi="10.1080/00031305.2017.1375989"><li><a href="https://doi.org/10.1080/00031305.2017.1375989" data-author="doi-provided" data-cit="doi-provided" data-title="doi-provided" target="_new" title="Go to article">
View Article
</a></li><li><a href="http://scholar.google.com/scholar?q=Data+organization+in+spreadsheets+Broman+2018" target="_new" title="Go to article in Google Scholar">
Google Scholar
</a></li></ul></li><li id="ref7"><span class="order">7.
</span><a name="pone.0323079.ref007" id="pone.0323079.ref007" class="link-target"></a>Ziemann M, Eren Y, El-Osta A. Gene name errors are widespread in the scientific literature. Genome Biol. 2016;17(1):177. pmid:27552985 <ul class="reflinks" data-doi="10.1186/s13059-016-1044-7"><li><a href="https://doi.org/10.1186/s13059-016-1044-7" data-author="doi-provided" data-cit="doi-provided" data-title="doi-provided" target="_new" title="Go to article">
View Article
</a></li><li><a href="http://www.ncbi.nlm.nih.gov/pubmed/27552985" target="_new" title="Go to article in PubMed">
PubMed/NCBI
</a></li><li><a href="http://scholar.google.com/scholar?q=Gene+name+errors+are+widespread+in+the+scientific+literature+Ziemann+2016" target="_new" title="Go to article in Google Scholar">
Google Scholar
</a></li></ul></li><li id="ref8"><span class="order">8.
</span><a name="pone.0323079.ref008" id="pone.0323079.ref008" class="link-target"></a>Petty D, Thompson J. The not-so-same-origin policy: bypassing web security through server misconfiguration. Independent Security Evaluators; 2017. <a href="https://www.ise.io/wp-content/uploads/2018/03/ise_same-origin-policy_whitepaper.pdf">https://www.ise.io/wp-content/uploads/2018/03/ise_same-origin-policy_whitepaper.pdf</a> <ul class="find-nolinks"></ul></li><li id="ref9"><span class="order">9.
</span><a name="pone.0323079.ref009" id="pone.0323079.ref009" class="link-target"></a>Chang W, Cheng J, Allaire J, Sievert C, Schloerke B, Xie Y, et al. Shiny: Web Application Framework for R. 2024. <a href="https://shiny.posit.co/">https://shiny.posit.co/</a> <ul class="reflinks"><li><a href="#" data-author="Chang" data-cit="ChangW%2C%20ChengJ%2C%20AllaireJ%2C%20SievertC%2C%20SchloerkeB%2C%20XieY%2C%20et%20al.%20Shiny%3A%20Web%20Application%20Framework%20for%20R.%202024.%20https%3A%2F%2Fshiny.posit.co%2F" data-title="Shiny%3A%20Web%20Application%20Framework%20for%20R" target="_new" title="Go to article in CrossRef">
View Article
</a></li><li><a href="http://scholar.google.com/scholar?q=Shiny%3A+Web+Application+Framework+for+R+Chang+2024" target="_new" title="Go to article in Google Scholar">
Google Scholar
</a></li></ul></li><li id="ref10"><span class="order">10.
</span><a name="pone.0323079.ref010" id="pone.0323079.ref010" class="link-target"></a>Durbin CG Jr. Effective use of tables and figures in abstracts, presentations, and papers. Respir Care. 2004;49(10):1233–7. pmid:15447809 <ul class="reflinks"><li><a href="#" data-author="Durbin" data-cit="DurbinCG%20Jr.%20Effective%20use%20of%20tables%20and%20figures%20in%20abstracts%2C%20presentations%2C%20and%20papers.%20Respir%20Care.%202004%3B49%2810%29%3A1233%E2%80%937.%2015447809" data-title="Effective%20use%20of%20tables%20and%20figures%20in%20abstracts%2C%20presentations%2C%20and%20papers" target="_new" title="Go to article in CrossRef">
View Article
</a></li><li><a href="http://www.ncbi.nlm.nih.gov/pubmed/15447809" target="_new" title="Go to article in PubMed">
PubMed/NCBI
</a></li><li><a href="http://scholar.google.com/scholar?q=Effective+use+of+tables+and+figures+in+abstracts%2C+presentations%2C+and+papers+Durbin+2004" target="_new" title="Go to article in Google Scholar">
Google Scholar
</a></li></ul></li><li id="ref11"><span class="order">11.
</span><a name="pone.0323079.ref011" id="pone.0323079.ref011" class="link-target"></a>Divecha CA, Tullu MS, Karande S. Utilizing tables, figures, charts and graphs to enhance the readability of a research paper. J Postgrad Med. 2023;69(3):125–31. pmid:37395532 <ul class="reflinks" data-doi="10.4103/jpgm.jpgm_387_23"><li><a href="https://doi.org/10.4103/jpgm.jpgm_387_23" data-author="doi-provided" data-cit="doi-provided" data-title="doi-provided" target="_new" title="Go to article">
View Article
</a></li><li><a href="http://www.ncbi.nlm.nih.gov/pubmed/37395532" target="_new" title="Go to article in PubMed">
PubMed/NCBI
</a></li><li><a href="http://scholar.google.com/scholar?q=Utilizing+tables%2C+figures%2C+charts+and+graphs+to+enhance+the+readability+of+a+research+paper+Divecha+2023" target="_new" title="Go to article in Google Scholar">
Google Scholar
</a></li></ul></li><li id="ref12"><span class="order">12.
</span><a name="pone.0323079.ref012" id="pone.0323079.ref012" class="link-target"></a>Ng KH, Peh WC. Preparing effective tables. Singapore Med J. 2009;50(2):117–8; quiz 119. pmid:19296024 <ul class="reflinks"><li><a href="#" data-author="Ng" data-cit="NgKH%2C%20PehWC.%20Preparing%20effective%20tables.%20Singapore%20Med%20J.%202009%3B50%282%29%3A117%E2%80%938%3B%20quiz%20119.%2019296024" data-title="Preparing%20effective%20tables" target="_new" title="Go to article in CrossRef">
View Article
</a></li><li><a href="http://www.ncbi.nlm.nih.gov/pubmed/19296024" target="_new" title="Go to article in PubMed">
PubMed/NCBI
</a></li><li><a href="http://scholar.google.com/scholar?q=Preparing+effective+tables+Ng+2009" target="_new" title="Go to article in Google Scholar">
Google Scholar
</a></li></ul></li><li id="ref13"><span class="order">13.
</span><a name="pone.0323079.ref013" id="pone.0323079.ref013" class="link-target"></a>Gruber J. Markdown: syntax. 2012. <a href="https://daringfireball.net/projects/markdown/syntax">https://daringfireball.net/projects/markdown/syntax</a> <ul class="find-nolinks"></ul></li><li id="ref14"><span class="order">14.
</span><a name="pone.0323079.ref014" id="pone.0323079.ref014" class="link-target"></a>Holtgrewe M, Stolpe O, Nieminen M, Mundlos S, Knaus A, Kornak U, et al. VarFish: comprehensive DNA variant analysis for diagnostics and research. Nucleic Acids Res. 2020;48(W1):W162–9. pmid:32338743 <ul class="reflinks" data-doi="10.1093/nar/gkaa241"><li><a href="https://doi.org/10.1093/nar/gkaa241" data-author="doi-provided" data-cit="doi-provided" data-title="doi-provided" target="_new" title="Go to article">
View Article
</a></li><li><a href="http://www.ncbi.nlm.nih.gov/pubmed/32338743" target="_new" title="Go to article in PubMed">
PubMed/NCBI
</a></li><li><a href="http://scholar.google.com/scholar?q=VarFish%3A+comprehensive+DNA+variant+analysis+for+diagnostics+and+research+Holtgrewe+2020" target="_new" title="Go to article in Google Scholar">
Google Scholar
</a></li></ul></li><li id="ref15"><span class="order">15.
</span><a name="pone.0323079.ref015" id="pone.0323079.ref015" class="link-target"></a>Cerami E, Gao J, Dogrusoz U, Gross BE, Sumer SO, Aksoy BA, et al. The cBio cancer genomics portal: an open platform for exploring multidimensional cancer genomics data. Cancer Discov. 2012;2(5):401–4. pmid:22588877 <ul class="reflinks" data-doi="10.1158/2159-8290.CD-12-0095"><li><a href="https://doi.org/10.1158/2159-8290.CD-12-0095" data-author="doi-provided" data-cit="doi-provided" data-title="doi-provided" target="_new" title="Go to article">
View Article
</a></li><li><a href="http://www.ncbi.nlm.nih.gov/pubmed/22588877" target="_new" title="Go to article in PubMed">
PubMed/NCBI
</a></li><li><a href="http://scholar.google.com/scholar?q=The+cBio+cancer+genomics+portal%3A+an+open+platform+for+exploring+multidimensional+cancer+genomics+data+Cerami+2012" target="_new" title="Go to article in Google Scholar">
Google Scholar
</a></li></ul></li><li id="ref16"><span class="order">16.
</span><a name="pone.0323079.ref016" id="pone.0323079.ref016" class="link-target"></a>Gao J, Aksoy BA, Dogrusoz U, Dresdner G, Gross B, Sumer SO, et al. Integrative analysis of complex cancer genomics and clinical profiles using the cBioPortal. Sci Signal. 2013;6(269):pl1. pmid:23550210 <ul class="reflinks" data-doi="10.1126/scisignal.2004088"><li><a href="https://doi.org/10.1126/scisignal.2004088" data-author="doi-provided" data-cit="doi-provided" data-title="doi-provided" target="_new" title="Go to article">
View Article
</a></li><li><a href="http://www.ncbi.nlm.nih.gov/pubmed/23550210" target="_new" title="Go to article in PubMed">
PubMed/NCBI
</a></li><li><a href="http://scholar.google.com/scholar?q=Integrative+analysis+of+complex+cancer+genomics+and+clinical+profiles+using+the+cBioPortal+Gao+2013" target="_new" title="Go to article in Google Scholar">
Google Scholar
</a></li></ul></li><li id="ref17"><span class="order">17.
</span><a name="pone.0323079.ref017" id="pone.0323079.ref017" class="link-target"></a>Gao J, Aksoy BA, Dogrusoz U, Dresdner G, Gross B, Sumer SO, et al. Integrative analysis of complex cancer genomics and clinical profiles using the cBioPortal. Sci Signal. 2013;6(269):pl1. pmid:23550210 <ul class="reflinks" data-doi="10.1126/scisignal.2004088"><li><a href="https://doi.org/10.1126/scisignal.2004088" data-author="doi-provided" data-cit="doi-provided" data-title="doi-provided" target="_new" title="Go to article">
View Article
</a></li><li><a href="http://www.ncbi.nlm.nih.gov/pubmed/23550210" target="_new" title="Go to article in PubMed">
PubMed/NCBI
</a></li><li><a href="http://scholar.google.com/scholar?q=Integrative+analysis+of+complex+cancer+genomics+and+clinical+profiles+using+the+cBioPortal+Gao+2013" target="_new" title="Go to article in Google Scholar">
Google Scholar
</a></li></ul></li><li id="ref18"><span class="order">18.
</span><a name="pone.0323079.ref018" id="pone.0323079.ref018" class="link-target"></a>Megill C, Martin B, Weaver C, Bell S, Prins L, Badajoz S, et al. Cellxgene: a performant, scalable exploration platform for high dimensional sparse matrices. Cold Spring Harbor Laboratory; 2021. <ul class="reflinks" data-doi="10.1101/2021.04.05.438318"><li><a href="https://doi.org/10.1101/2021.04.05.438318" data-author="doi-provided" data-cit="doi-provided" data-title="doi-provided" target="_new" title="Go to article">
View Article
</a></li><li><a href="http://scholar.google.com/scholar?q=+Megill+2021" target="_new" title="Go to article in Google Scholar">
Google Scholar
</a></li></ul></li><li id="ref19"><span class="order">19.
</span><a name="pone.0323079.ref019" id="pone.0323079.ref019" class="link-target"></a>Sanjuán LG, Ramírez-Cruzado S, Díaz-Guardamino M, Rodríguez JAL, Romero TD, Vargas JÁA, et al. A multi-analytical study of the Montelirio beaded attires: marine resources, sumptuary crafts, and female power in copper age Iberia. Sci Adv. 2025;11(5):eadp1917. pmid:39879290 <ul class="reflinks" data-doi="10.1126/sciadv.adp1917"><li><a href="https://doi.org/10.1126/sciadv.adp1917" data-author="doi-provided" data-cit="doi-provided" data-title="doi-provided" target="_new" title="Go to article">
View Article
</a></li><li><a href="http://www.ncbi.nlm.nih.gov/pubmed/39879290" target="_new" title="Go to article in PubMed">
PubMed/NCBI
</a></li><li><a href="http://scholar.google.com/scholar?q=A+multi-analytical+study+of+the+Montelirio+beaded+attires%3A+marine+resources%2C+sumptuary+crafts%2C+and+female+power+in+copper+age+Iberia+Sanju%C3%A1n+2025" target="_new" title="Go to article in Google Scholar">
Google Scholar
</a></li></ul></li><li id="ref20"><span class="order">20.
</span><a name="pone.0323079.ref020" id="pone.0323079.ref020" class="link-target"></a>Klein D, Palla G, Lange M, Klein M, Piran Z, Gander M, et al. Mapping cells through time and space with moscot. Nature. 2025;638(8052):1065–75. pmid:39843746 <ul class="reflinks" data-doi="10.1038/s41586-024-08453-2"><li><a href="https://doi.org/10.1038/s41586-024-08453-2" data-author="doi-provided" data-cit="doi-provided" data-title="doi-provided" target="_new" title="Go to article">
View Article
</a></li><li><a href="http://www.ncbi.nlm.nih.gov/pubmed/39843746" target="_new" title="Go to article in PubMed">
PubMed/NCBI
</a></li><li><a href="http://scholar.google.com/scholar?q=Mapping+cells+through+time+and+space+with+moscot+Klein+2025" target="_new" title="Go to article in Google Scholar">
Google Scholar
</a></li></ul></li><li id="ref21"><span class="order">21.
</span><a name="pone.0323079.ref021" id="pone.0323079.ref021" class="link-target"></a>Alayón-Gamboa J, Jimenez-Ferrer G, Nahed Toral J, G VL. Estrategias silvopastoriles para mitigar efectos del cambio climático en sistemas ganaderos del sur de México. Agro Productividad. 2016;9:10–5. <ul class="reflinks"><li><a href="#" data-author="Alay%C3%B3n-Gamboa" data-cit="Alay%C3%B3n-GamboaJ%2C%20Jimenez-FerrerG%2C%20Nahed%20ToralJ%2C%20GVL.%20Estrategias%20silvopastoriles%20para%20mitigar%20efectos%20del%20cambio%20clim%C3%A1tico%20en%20sistemas%20ganaderos%20del%20sur%20de%20M%C3%A9xico.%20Agro%20Productividad.%202016%3B9%3A10%E2%80%935." data-title="Estrategias%20silvopastoriles%20para%20mitigar%20efectos%20del%20cambio%20clim%C3%A1tico%20en%20sistemas%20ganaderos%20del%20sur%20de%20M%C3%A9xico" target="_new" title="Go to article in CrossRef">
View Article
</a></li><li><a href="http://scholar.google.com/scholar?q=Estrategias+silvopastoriles+para+mitigar+efectos+del+cambio+clim%C3%A1tico+en+sistemas+ganaderos+del+sur+de+M%C3%A9xico+Alay%C3%B3n-Gamboa+2016" target="_new" title="Go to article in Google Scholar">
Google Scholar
</a></li></ul></li><li id="ref22"><span class="order">22.
</span><a name="pone.0323079.ref022" id="pone.0323079.ref022" class="link-target"></a>Barraud O, Doressoundiram A, Besse S, Sunshine JM. Near-ultraviolet to near-infrared spectral properties of hollows on mercury: implications for origin and formation process. JGR Planets. 2020;125(12). <ul class="reflinks" data-doi="10.1029/2020je006497"><li><a href="https://doi.org/10.1029/2020je006497" data-author="doi-provided" data-cit="doi-provided" data-title="doi-provided" target="_new" title="Go to article">
View Article
</a></li><li><a href="http://scholar.google.com/scholar?q=Near-ultraviolet+to+near-infrared+spectral+properties+of+hollows+on+mercury%3A+implications+for+origin+and+formation+process+Barraud+2020" target="_new" title="Go to article in Google Scholar">
Google Scholar
</a></li></ul></li><li id="ref23"><span class="order">23.
</span><a name="pone.0323079.ref023" id="pone.0323079.ref023" class="link-target"></a>Robinson JT, Thorvaldsdóttir H, Winckler W, Guttman M, Lander ES, Getz G, et al. Integrative genomics viewer. Nat Biotechnol. 2011;29(1):24–6. pmid:21221095 <ul class="reflinks" data-doi="10.1038/nbt.1754"><li><a href="https://doi.org/10.1038/nbt.1754" data-author="doi-provided" data-cit="doi-provided" data-title="doi-provided" target="_new" title="Go to article">
View Article
</a></li><li><a href="http://www.ncbi.nlm.nih.gov/pubmed/21221095" target="_new" title="Go to article in PubMed">
PubMed/NCBI
</a></li><li><a href="http://scholar.google.com/scholar?q=Integrative+genomics+viewer+Robinson+2011" target="_new" title="Go to article in Google Scholar">
Google Scholar
</a></li></ul></li><li id="ref24"><span class="order">24.
</span><a name="pone.0323079.ref024" id="pone.0323079.ref024" class="link-target"></a>Di Tommaso P, Chatzou M, Floden EW, Barja PP, Palumbo E, Notredame C. Nextflow enables reproducible computational workflows. Nat Biotechnol. 2017;35(4):316–9. pmid:28398311 <ul class="reflinks" data-doi="10.1038/nbt.3820"><li><a href="https://doi.org/10.1038/nbt.3820" data-author="doi-provided" data-cit="doi-provided" data-title="doi-provided" target="_new" title="Go to article">
View Article
</a></li><li><a href="http://www.ncbi.nlm.nih.gov/pubmed/28398311" target="_new" title="Go to article in PubMed">
PubMed/NCBI
</a></li><li><a href="http://scholar.google.com/scholar?q=Nextflow+enables+reproducible+computational+workflows+Di+Tommaso+2017" target="_new" title="Go to article in Google Scholar">
Google Scholar
</a></li></ul></li><li id="ref25"><span class="order">25.
</span><a name="pone.0323079.ref025" id="pone.0323079.ref025" class="link-target"></a>Amstutz P, Crusoe MR, Tijanić N, Chapman B, Chilton J, Heuer M. Common workflow language, v1.0. 2016. <ul class="reflinks" data-doi="10.6084/m9.figshare.3115156.v2"><li><a href="https://doi.org/10.6084/m9.figshare.3115156.v2" data-author="doi-provided" data-cit="doi-provided" data-title="doi-provided" target="_new" title="Go to article">
View Article
</a></li><li><a href="http://scholar.google.com/scholar?q=Common+workflow+language%2C+v1.0+Amstutz+2016" target="_new" title="Go to article in Google Scholar">
Google Scholar
</a></li></ul></li><li id="ref26"><span class="order">26.
</span><a name="pone.0323079.ref026" id="pone.0323079.ref026" class="link-target"></a>Iannone R, Michael C. great-tables: make awesome display tables using Python. <a href="https://github.com/posit-dev/great-tables">https://github.com/posit-dev/great-tables</a> <ul class="reflinks"><li><a href="#" data-author="Iannone" data-cit="IannoneR%2C%20MichaelC.%20great-tables%3A%20make%20awesome%20display%20tables%20using%20Python.%20https%3A%2F%2Fgithub.com%2Fposit-dev%2Fgreat-tables" data-title="great-tables%3A%20make%20awesome%20display%20tables%20using%20Python" target="_new" title="Go to article in CrossRef">
View Article
</a></li><li><a href="http://scholar.google.com/scholar?q=great-tables%3A+make+awesome+display+tables+using+Python+Iannone+" target="_new" title="Go to article in Google Scholar">
Google Scholar
</a></li></ul></li><li id="ref27"><span class="order">27.
</span><a name="pone.0323079.ref027" id="pone.0323079.ref027" class="link-target"></a>Posit Software P. ShinyApps.io. <a href="https://www.shinyapps.io">https://www.shinyapps.io</a> <ul class="find-nolinks"></ul></li><li id="ref28"><span class="order">28.
</span><a name="pone.0323079.ref028" id="pone.0323079.ref028" class="link-target"></a>Parmer C, Duval P, Johnson A. A data and analytics web app framework for Python, no JavaScript required. 2024. <a href="https://github.com/plotly/dash">https://github.com/plotly/dash</a> <ul class="reflinks"><li><a href="#" data-author="Parmer" data-cit="ParmerC%2C%20DuvalP%2C%20JohnsonA.%20A%20data%20and%20analytics%20web%20app%20framework%20for%20Python%2C%20no%20JavaScript%20required.%202024.%20https%3A%2F%2Fgithub.com%2Fplotly%2Fdash" data-title="A%20data%20and%20analytics%20web%20app%20framework%20for%20Python%2C%20no%20JavaScript%20required" target="_new" title="Go to article in CrossRef">
View Article
</a></li><li><a href="http://scholar.google.com/scholar?q=A+data+and+analytics+web+app+framework+for+Python%2C+no+JavaScript+required+Parmer+2024" target="_new" title="Go to article in Google Scholar">
Google Scholar
</a></li></ul></li><li id="ref29"><span class="order">29.
</span><a name="pone.0323079.ref029" id="pone.0323079.ref029" class="link-target"></a>HoloViz. Lumen. <a href="https://lumen.holoviz.org">https://lumen.holoviz.org</a> <ul class="find-nolinks"></ul></li><li id="ref30"><span class="order">30.
</span><a name="pone.0323079.ref030" id="pone.0323079.ref030" class="link-target"></a>Observable. D3.js—Data-driven documents. <a href="https://d3js.org">https://d3js.org</a> <ul class="find-nolinks"></ul></li><li id="ref31"><span class="order">31.
</span><a name="pone.0323079.ref031" id="pone.0323079.ref031" class="link-target"></a>Plotly. 2023. <a href="https://plotly.com">https://plotly.com</a> <ul class="find-nolinks"></ul></li><li id="ref32"><span class="order">32.
</span><a name="pone.0323079.ref032" id="pone.0323079.ref032" class="link-target"></a>The Rust Team. The Rust Programming Language. <a href="https://www.rust-lang.org">https://www.rust-lang.org</a> <ul class="find-nolinks"></ul></li><li id="ref33"><span class="order">33.
</span><a name="pone.0323079.ref033" id="pone.0323079.ref033" class="link-target"></a>Datavzrd. Datavzrd on GitHub. <a href="https://github.com/datavzrd/datavzrd">https://github.com/datavzrd/datavzrd</a> <ul class="find-nolinks"></ul></li><li id="ref34"><span class="order">34.
</span><a name="pone.0323079.ref034" id="pone.0323079.ref034" class="link-target"></a>crates.io. Datavzrd on crates.io. <a href="https://crates.io/crates/datavzrd">https://crates.io/crates/datavzrd</a> <ul class="find-nolinks"></ul></li><li id="ref35"><span class="order">35.
</span><a name="pone.0323079.ref035" id="pone.0323079.ref035" class="link-target"></a>Conda-Forge. Datavzrd on Anaconda (conda-forge). <a href="https://anaconda.org/conda-forge/datavzrd">https://anaconda.org/conda-forge/datavzrd</a>. <ul class="find-nolinks"></ul></li><li id="ref36"><span class="order">36.
</span><a name="pone.0323079.ref036" id="pone.0323079.ref036" class="link-target"></a>Team S. Datavzrd Snakemake Wrapper. <a href="https://snakemake-wrappers.readthedocs.io/en/stable/wrappers/datavzrd.html">https://snakemake-wrappers.readthedocs.io/en/stable/wrappers/datavzrd.html</a> <ul class="find-nolinks"></ul></li><li id="ref37"><span class="order">37.
</span><a name="pone.0323079.ref037" id="pone.0323079.ref037" class="link-target"></a>Apache Parquet. <a href="https://parquet.apache.org">https://parquet.apache.org</a> <ul class="find-nolinks"></ul></li><li id="ref38"><span class="order">38.
</span><a name="pone.0323079.ref038" id="pone.0323079.ref038" class="link-target"></a>HTML Living Standard. <a href="https://html.spec.whatwg.org">https://html.spec.whatwg.org</a> <ul class="find-nolinks"></ul></li><li id="ref39"><span class="order">39.
</span><a name="pone.0323079.ref039" id="pone.0323079.ref039" class="link-target"></a>GitHub Pages. <a href="https://pages.github.com">https://pages.github.com</a> <ul class="find-nolinks"></ul></li><li id="ref40"><span class="order">40.
</span><a name="pone.0323079.ref040" id="pone.0323079.ref040" class="link-target"></a>YTE Template Engine. 2023. <a href="https://yte-template-engine.github.io">https://yte-template-engine.github.io</a> <ul class="find-nolinks"></ul></li><li id="ref41"><span class="order">41.
</span><a name="pone.0323079.ref041" id="pone.0323079.ref041" class="link-target"></a>Datavzrd Spells Repository. <a href="https://github.com/datavzrd/datavzrd-spells">https://github.com/datavzrd/datavzrd-spells</a> <ul class="find-nolinks"></ul></li><li id="ref42"><span class="order">42.
</span><a name="pone.0323079.ref042" id="pone.0323079.ref042" class="link-target"></a>Datavzrd Spells Documentation. <a href="https://datavzrd.github.io/docs/spells.html">https://datavzrd.github.io/docs/spells.html</a> <ul class="find-nolinks"></ul></li><li id="ref43"><span class="order">43.
</span><a name="pone.0323079.ref043" id="pone.0323079.ref043" class="link-target"></a>Datavzrd Example Report: Moscot (Bioinformatics). <a href="https://datavzrd.github.io/example-report-moscot/">https://datavzrd.github.io/example-report-moscot/</a> <ul class="find-nolinks"></ul></li><li id="ref44"><span class="order">44.
</span><a name="pone.0323079.ref044" id="pone.0323079.ref044" class="link-target"></a>Datavzrd Example Report: Diversity in Human-Wildlife (Social Science). 2023. <a href="https://datavzrd.github.io/example-report-diversity-in-human-wildlife/">https://datavzrd.github.io/example-report-diversity-in-human-wildlife/</a> <ul class="find-nolinks"></ul></li><li id="ref45"><span class="order">45.
</span><a name="pone.0323079.ref045" id="pone.0323079.ref045" class="link-target"></a>Datavzrd Example Report: Spatial Pattern Analysis. <a href="https://datavzrd.github.io/example-report-spatial-pattern-analysis/">https://datavzrd.github.io/example-report-spatial-pattern-analysis/</a> <ul class="find-nolinks"></ul></li><li id="ref46"><span class="order">46.
</span><a name="pone.0323079.ref046" id="pone.0323079.ref046" class="link-target"></a>Datavzrd Example Report: Beaded Attires Study. <a href="https://datavzrd.github.io/example-report-beaded-attires-study/">https://datavzrd.github.io/example-report-beaded-attires-study/</a> <ul class="find-nolinks"></ul></li><li id="ref47"><span class="order">47.
</span><a name="pone.0323079.ref047" id="pone.0323079.ref047" class="link-target"></a>Datavzrd Benchmark Repository. <a href="https://github.com/koesterlab/datavzrd-benchmark">https://github.com/koesterlab/datavzrd-benchmark</a> <ul class="find-nolinks"></ul></li><li id="ref48"><span class="order">48.
</span><a name="pone.0323079.ref048" id="pone.0323079.ref048" class="link-target"></a>Electric Vehicle Population Data. <a href="https://catalog.data.gov/dataset/electric-vehicle-population-data">https://catalog.data.gov/dataset/electric-vehicle-population-data</a> <ul class="find-nolinks"></ul></li><li id="ref49"><span class="order">49.
</span><a name="pone.0323079.ref049" id="pone.0323079.ref049" class="link-target"></a>HDF5 - Hierarchical Data Format. <a href="https://www.hdfgroup.org/solutions/hdf5/">https://www.hdfgroup.org/solutions/hdf5/</a> <ul class="find-nolinks"></ul></li><li id="ref50"><span class="order">50.
</span><a name="pone.0323079.ref050" id="pone.0323079.ref050" class="link-target"></a>Raasveldt M, Muehleisen H. DuckDB. <a href="https://github.com/duckdb/duckdb">https://github.com/duckdb/duckdb</a> <ul class="find-nolinks"></ul></li><li id="ref51"><span class="order">51.
</span><a name="pone.0323079.ref051" id="pone.0323079.ref051" class="link-target"></a>FlatBuffers. <a href="https://flatbuffers.dev">https://flatbuffers.dev</a> <ul class="find-nolinks"></ul></li><li id="ref52"><span class="order">52.
</span><a name="pone.0323079.ref052" id="pone.0323079.ref052" class="link-target"></a>SQLite. <a href="https://sqlite.org/">https://sqlite.org/</a> <ul class="find-nolinks"></ul></li><li id="ref53"><span class="order">53.
</span><a name="pone.0323079.ref053" id="pone.0323079.ref053" class="link-target"></a>C L. JSONM: json compressor for packing messages with memoization;. <a href="https://github.com/lennartcl/jsonm">https://github.com/lennartcl/jsonm</a> <ul class="find-nolinks"></ul></li><li id="ref54"><span class="order">54.
</span><a name="pone.0323079.ref054" id="pone.0323079.ref054" class="link-target"></a>Lz-string: JavaScript compression, fast! <a href="https://pieroxy.net/blog/pages/lz-string/index.html">https://pieroxy.net/blog/pages/lz-string/index.html</a> <ul class="find-nolinks"></ul></li><li id="ref55"><span class="order">55.
</span><a name="pone.0323079.ref055" id="pone.0323079.ref055" class="link-target"></a>Web Components Community Group. Web Components Community Group. <a href="https://github.com/WICG/webcomponents">https://github.com/WICG/webcomponents</a> <ul class="find-nolinks"></ul></li><li id="ref56"><span class="order">56.
</span><a name="pone.0323079.ref056" id="pone.0323079.ref056" class="link-target"></a>Datavzrd Spell Catalog – Boolean Spell. <a href="https://datavzrd.github.io/docs/spells.html#boolean">https://datavzrd.github.io/docs/spells.html#boolean</a> <ul class="find-nolinks"></ul></li></ol></div>
<div class="ref-tooltip">
<div class="ref_tooltip-content">
</div>
</div>
</div>
</div>
</div>
</section>
<aside class="article-aside">
<!--[if IE 9]>
<style>
.dload-xml {margin-top: 38px}
</style>
<![endif]-->
<div class="dload-menu">
<div class="dload-pdf">
<a href="/plosone/article/file?id=10.1371/journal.pone.0323079&type=printable"
id="downloadPdf" target="_blank">Download PDF</a>
</div>
<div data-js-tooltip-hover="trigger" class="dload-hover">
<ul class="dload-xml" data-js-tooltip-hover="target">
<li><a href="/plosone/article/citation?id=10.1371/journal.pone.0323079"
id="downloadCitation">Citation</a></li>
<li><a href="/plosone/article/file?id=10.1371/journal.pone.0323079&type=manuscript"
id="downloadXml">XML</a>
</li>
</ul>
</div>
</div>
<div class="aside-container">
<div class="print-article" id="printArticle" data-js-tooltip-hover="trigger">
<a href="#" onclick="window.print(); return false;" class="preventDefault" id="printBrowser">Print</a>
</div>
<div class="share-article" id="shareArticle" data-js-tooltip-hover="trigger">
Share
<ul data-js-tooltip-hover="target" class="share-options" id="share-options">
<li><a href="https://www.reddit.com/submit?url=https%3A%2F%2Fdx.plos.org%2F10.1371%2Fjournal.pone.0323079" id="shareReddit" target="_blank" title="Submit to Reddit"><img src="/resource/img/icon.reddit.16.png" width="16" height="16" alt="Reddit">Reddit</a></li>
<li><a href="https://www.facebook.com/share.php?u=https%3A%2F%2Fdx.plos.org%2F10.1371%2Fjournal.pone.0323079&t=Datavzrd: Rapid programming- and maintenance-free interactive visualization and communication of tabular data" id="shareFacebook" target="_blank" title="Share on Facebook"><img src="/resource/img/icon.fb.16.png" width="16" height="16" alt="Facebook">Facebook</a></li>
<li><a href="https://www.linkedin.com/shareArticle?url=https%3A%2F%2Fdx.plos.org%2F10.1371%2Fjournal.pone.0323079&title=Datavzrd: Rapid programming- and maintenance-free interactive visualization and communication of tabular data&summary=Checkout this article I found at PLOS" id="shareLinkedIn" target="_blank" title="Add to LinkedIn"><img src="/resource/img/icon.linkedin.16.png" width="16" height="16" alt="LinkedIn">LinkedIn</a></li>
<li><a href="https://www.mendeley.com/import/?url=https%3A%2F%2Fdx.plos.org%2F10.1371%2Fjournal.pone.0323079" id="shareMendeley" target="_blank" title="Add to Mendeley"><img src="/resource/img/icon.mendeley.16.png" width="16" height="16" alt="Mendeley">Mendeley</a></li>
<li><a href="https://bsky.app/intent/compose?text=Checkout%20this%20article%20I%20found%20at%20PLOS:%20https%3A%2F%2Fdx.plos.org%2F10.1371%2Fjournal.pone.0323079" id="shareBluesky" target="_blank" title="Share on Bluesky"><img src="/resource/img/icon.bluesky.light.png" width="16" height="16" alt="Bluesky">Bluesky</a></li>
<li><a href="mailto:?subject=Datavzrd: Rapid programming- and maintenance-free interactive visualization and communication of tabular data&body=I%20thought%20you%20would%20find%20this%20article%20interesting.%20From%20PLOS ONE:%20https%3A%2F%2Fdx.plos.org%2F10.1371%2Fjournal.pone.0323079" id="shareEmail" rel="noreferrer" aria-label="Email"><img src="/resource/img/icon.email.16.png" width="16" height="16" alt="Email">Email</a></li>
</ul>
</div>
</div>
<!-- Crossmark 2.0 widget -->
<script src="https://crossmark-cdn.crossref.org/widget/v2.0/widget.js"></script>
<a aria-label="Check for updates via CrossMark" data-target="crossmark">
<img alt="Check for updates via CrossMark" width="150" src="https://crossmark-cdn.crossref.org/widget/v2.0/logos/CROSSMARK_BW_horizontal.svg">
</a>
<!-- End Crossmark 2.0 widget -->
<div class="aside-container collections-aside-container"><!-- React Magic --></div>
<div class="skyscraper-container">
<div class="title">Advertisement</div>
<!-- DoubleClick Ad Zone -->
<div class='advertisement' id='div-gpt-ad-1458247671871-1' style='width:160px; height:600px;'>
<script type='text/javascript'>
googletag.cmd.push(function() { googletag.display('div-gpt-ad-1458247671871-1'); });
</script>
</div>
</div>
<div class="subject-areas-container">
<h3>Subject Areas <div id="subjInfo">?</div>
<div id="subjInfoText">
<p>For more information about PLOS Subject Areas, click
<a href="https://github.com/PLOS/plos-thesaurus/blob/master/README.md" target="_blank" title="Link opens in new window">here</a>.</p>
<span class="inline-intro">We want your feedback.</span> Do these Subject Areas make sense for this article? Click the target next to the incorrect Subject Area and let us know. Thanks for your help!
</div>
</h3>
<ul id="subjectList">
<li>
<a class="taxo-term" title="Search for articles about Data visualization"
href="/plosone/search?filterSubjects=Data+visualization&filterJournals=PLoSONE&q=">Data visualization</a>
<span class="taxo-flag"> </span>
<div class="taxo-tooltip" data-categoryname="Data visualization"><p class="taxo-explain">Is the Subject Area <strong>"Data visualization"</strong> applicable to this article?
<button id="noFlag" data-action="remove">Yes</button>
<button id="flagIt" value="flagno" data-action="add">No</button></p>
<p class="taxo-confirm">Thanks for your feedback.</p>
</div>
</li>
<li>
<a class="taxo-term" title="Search for articles about Programming languages"
href="/plosone/search?filterSubjects=Programming+languages&filterJournals=PLoSONE&q=">Programming languages</a>
<span class="taxo-flag"> </span>
<div class="taxo-tooltip" data-categoryname="Programming languages"><p class="taxo-explain">Is the Subject Area <strong>"Programming languages"</strong> applicable to this article?
<button id="noFlag" data-action="remove">Yes</button>
<button id="flagIt" value="flagno" data-action="add">No</button></p>
<p class="taxo-confirm">Thanks for your feedback.</p>
</div>
</li>
<li>
<a class="taxo-term" title="Search for articles about Reproducibility"
href="/plosone/search?filterSubjects=Reproducibility&filterJournals=PLoSONE&q=">Reproducibility</a>
<span class="taxo-flag"> </span>
<div class="taxo-tooltip" data-categoryname="Reproducibility"><p class="taxo-explain">Is the Subject Area <strong>"Reproducibility"</strong> applicable to this article?
<button id="noFlag" data-action="remove">Yes</button>
<button id="flagIt" value="flagno" data-action="add">No</button></p>
<p class="taxo-confirm">Thanks for your feedback.</p>
</div>
</li>
<li>
<a class="taxo-term" title="Search for articles about Web-based applications"
href="/plosone/search?filterSubjects=Web-based+applications&filterJournals=PLoSONE&q=">Web-based applications</a>
<span class="taxo-flag"> </span>
<div class="taxo-tooltip" data-categoryname="Web-based applications"><p class="taxo-explain">Is the Subject Area <strong>"Web-based applications"</strong> applicable to this article?
<button id="noFlag" data-action="remove">Yes</button>
<button id="flagIt" value="flagno" data-action="add">No</button></p>
<p class="taxo-confirm">Thanks for your feedback.</p>
</div>
</li>
<li>
<a class="taxo-term" title="Search for articles about Genomics"
href="/plosone/search?filterSubjects=Genomics&filterJournals=PLoSONE&q=">Genomics</a>
<span class="taxo-flag"> </span>
<div class="taxo-tooltip" data-categoryname="Genomics"><p class="taxo-explain">Is the Subject Area <strong>"Genomics"</strong> applicable to this article?
<button id="noFlag" data-action="remove">Yes</button>
<button id="flagIt" value="flagno" data-action="add">No</button></p>
<p class="taxo-confirm">Thanks for your feedback.</p>
</div>
</li>
<li>
<a class="taxo-term" title="Search for articles about Data compression"
href="/plosone/search?filterSubjects=Data+compression&filterJournals=PLoSONE&q=">Data compression</a>
<span class="taxo-flag"> </span>
<div class="taxo-tooltip" data-categoryname="Data compression"><p class="taxo-explain">Is the Subject Area <strong>"Data compression"</strong> applicable to this article?
<button id="noFlag" data-action="remove">Yes</button>
<button id="flagIt" value="flagno" data-action="add">No</button></p>
<p class="taxo-confirm">Thanks for your feedback.</p>
</div>
</li>
<li>
<a class="taxo-term" title="Search for articles about Genetic footprinting"
href="/plosone/search?filterSubjects=Genetic+footprinting&filterJournals=PLoSONE&q=">Genetic footprinting</a>
<span class="taxo-flag"> </span>
<div class="taxo-tooltip" data-categoryname="Genetic footprinting"><p class="taxo-explain">Is the Subject Area <strong>"Genetic footprinting"</strong> applicable to this article?
<button id="noFlag" data-action="remove">Yes</button>
<button id="flagIt" value="flagno" data-action="add">No</button></p>
<p class="taxo-confirm">Thanks for your feedback.</p>
</div>
</li>
<li>
<a class="taxo-term" title="Search for articles about Open source software"
href="/plosone/search?filterSubjects=Open+source+software&filterJournals=PLoSONE&q=">Open source software</a>
<span class="taxo-flag"> </span>
<div class="taxo-tooltip" data-categoryname="Open source software"><p class="taxo-explain">Is the Subject Area <strong>"Open source software"</strong> applicable to this article?
<button id="noFlag" data-action="remove">Yes</button>
<button id="flagIt" value="flagno" data-action="add">No</button></p>
<p class="taxo-confirm">Thanks for your feedback.</p>
</div>
</li>
</ul>
</div>
<div id="subjectErrors"></div>
</aside>
</div>
</main>
<footer id="pageftr">
<div class="row">
<div class="block x-small">
<ul class="nav nav-secondary">
<li class="ftr-header"><a href="https://plos.org/our-journals/">Publications</a></li>
<li><a href="/agingandhealth/" id="ftr-age">PLOS Aging and Health</a></li>
<li><a href="/plosbiology/" id="ftr-bio">PLOS Biology</a></li>
<li><a href="/climate/" id="ftr-climate">PLOS Climate</a></li>
<li><a href="/complexsystems/" id="ftr-complex-systems">PLOS Complex Systems</a></li>
<li><a href="/ploscompbiol/" id="ftr-compbio">PLOS Computational Biology</a></li>
<li><a href="/digitalhealth/" id="ftr-digitalhealth">PLOS Digital Health</a></li>
<li><a href="/ecosystems/" id="ftr-eco">PLOS Ecosystems</a></li>
<li><a href="/plosgenetics/" id="ftr-gen">PLOS Genetics</a></li>
</ul>
</div>
<div class="block x-small">
<ul class="nav nav-secondary">
<li class="ftr-header"> </li>
<li><a href="/globalpublichealth/" id="ftr-globalpublichealth">PLOS Global Public Health</a></li>
<li><a href="/plosmedicine/" id="ftr-med">PLOS Medicine</a></li>
<li><a href="/mentalhealth/" id="ftr-mental-health">PLOS Mental Health</a></li>
<li><a href="/plosntds/" id="ftr-ntds">PLOS Neglected Tropical Diseases</a></li>
<li><a href="/plosone/" id="ftr-one">PLOS One</a></li>
<li><a href="/plospathogens/" id="ftr-path">PLOS Pathogens</a></li>
<li><a href="/sustainabilitytransformation/" id="ftr-sustainabilitytransformation">PLOS Sustainability and Transformation</a></li>
<li><a href="/water/" id="ftr-water">PLOS Water</a></li>
</ul>
</div>
<div class="block xx-small">
<ul class="nav nav-tertiary">
<li>
<a href="https://plos.org" id="ftr-home">Home</a>
</li>
<li>
<a href="https://blogs.plos.org" id="ftr-blog">Blogs</a>
</li>
<li>
<a href="https://collections.plos.org/" id="ftr-collections">Collections</a>
</li>
<li>
<a href="mailto:customercare@plos.org" id="ftr-feedback">Give feedback</a>
</li>
<li>
<a href="/plosone/lockss-manifest" id="ftr-lockss">LOCKSS</a>
</li>
</ul>
</div>
<div class="block xx-small">
<ul class="nav nav-primary">
<li><a href="https://plos.org/privacy-policy" id="ftr-privacy">Privacy Policy</a></li>
<li><a href="https://plos.org/terms-of-use" id="ftr-terms">Terms of Use</a></li>
<li><a href="https://plos.org/advertise/" id="ftr-advertise">Advertise</a></li>
<li><a href="https://plos.org/media-inquiries" id="ftr-media">Media Inquiries</a></li>
<li><a href="https://plos.org/contact" id="ftr-contact">Contact</a></li>
</ul>
</div>
</div>
<div class="row">
<p>
<img src="/resource/img/logo-plos-footer.png" alt="PLOS" class="logo-footer"/>
<span class="footer-non-profit-statement">PLOS is a nonprofit 501(c)(3) corporation, #C2354500, based in California, US</span> </p>
<div class="block">
</div>
</div>
<script src="/resource/js/global.js" type="text/javascript"></script>
</footer>
<script type="text/javascript">
var ArticleData = {
doi: '10.1371/journal.pone.0323079',
title: '<article-title xmlns:mml=\"http://www.w3.org/1998/Math/MathML\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">Datavzrd: Rapid programming- and maintenance-free interactive visualization and communication of tabular data<\/article-title>',
date: 'Jul 22, 2025'
};
</script>
<script src="/resource/js/components/show_onscroll.js" type="text/javascript"></script>
<script src="/resource/js/components/pagination.js" type="text/javascript"></script>
<script src="/resource/js/vendor/spin.js" type="text/javascript"></script>
<script src="/resource/js/pages/article.js" type="text/javascript"></script>
<script src="/resource/js/pages/article_references.js" type="text/javascript"></script>
<script src="/resource/js/pages/article_sidebar.js" type="text/javascript"></script>
<script src="/resource/js/vendor/foundation/foundation.dropdown.js" type="text/javascript"></script>
<script src="/resource/js/components/table_open.js" type="text/javascript"></script>
<script src="/resource/js/components/figshare.js" type="text/javascript"></script>
<script src="/resource/js/vendor/jquery.panzoom.min.js" type="text/javascript"></script>
<script src="/resource/js/vendor/jquery.mousewheel.js" type="text/javascript"></script>
<script src="/resource/js/components/lightbox.js" type="text/javascript"></script>
<script src="/resource/js/pages/article_body.js" type="text/javascript"></script>
<!-- This file should be loaded before the renderJs, to avoid conflicts with the FigShare, that implements the MathJax also. -->
<!-- mathjax configuration options -->
<!-- more can be found at http://docs.mathjax.org/en/latest/ -->
<script type="text/x-mathjax-config">
MathJax.Hub.Config({
"HTML-CSS": {
scale: 100,
availableFonts: ["STIX","TeX"],
preferredFont: "STIX",
webFont: "STIX-Web",
linebreaks: { automatic: false }
},
jax: ["input/MathML", "output/HTML-CSS"]
});
</script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=MML_HTMLorMML"></script>
<div class="reveal-modal-bg"></div>
</body>
</html>
Comments
Post a Comment