Changelog
Source:NEWS.md
jjstatsplot 1.0.52 (2026-08-13)
A pre-release. The version carries a two-digit patch, so the release workflow publishes it as a GitHub pre-release rather than a full release.
Most of this window was a per-analysis review pass, and several of the fixes change numbers or labels you may already be quoting. Read Breaking changes and Corrected output before upgrading a running project.
Added
-
New analysis: Dot Chart (
jjdotchart). Collapses each group to a single summary point and tests those points against a reference value. The panel states plainly that n is the number of groups, not the number of patients, and the summary table reports the per-group n so the aggregation stays auditable. Options includetestvalue,typestatistics,grvar,centralityplotting/centralitytype(a labelled centrality line, distinct from the reference line),conflevelandshowSummaryTable. -
Line Chart:
showRefline. The reference line has its own switch (see Breaking changes). -
Automatic Plot Selection:
sampleThresholdandsampleSize. The subsampling threshold and retained row count were hard-coded at 10,000 and 5,000; both are now configurable, and asking to keep more rows than exist is clamped rather than erroring. -
Segmented Total Bar Charts:
y_is_count. Required before a chi-square test will run (see Breaking changes), plus aRows Analysedcolumn alongsideSummed Value.
Breaking changes
-
Line Chart:
refline = 0no longer draws a line by itself. Zero used to mean “no reference line”, which made the most common clinical reference impossible to draw - change-from-baseline, a difference and a log fold-change all sit at zero. SetshowRefline = TRUEand put any value, including0, inrefline. Scripts relying on a non-zeroreflinealone must addshowRefline = TRUE. -
Segmented Total Bar Charts: statistical tests require
y_is_count = TRUE. The chi-square is computed on the summed Value Variable, which is a contingency table only when that variable counts cases. Integrality cannot establish this - a whole-number measurement passes too, and the statistic then scales with the unit of measurement. Existing analyses with tests enabled will show an explanation instead of a test until the box is ticked.
Corrected output
-
Bar Charts and Pie Charts no longer name a Fisher test that was never run. On a sparse 2x2 both analyses used to advise switching
typestatisticsto"nonparametric"“to obtain Fisher’s exact test”. That switch produced the identical uncorrected Pearson chi-square - the plotting package offers no exact test - and in Pie Charts the copy-ready Methods sentence went as far as printing “using Fisher’s exact test”. The chart subtitle now reports Fisher’s exact test itself, with the odds ratio and its interval, whenever the table is 2x2 with an expected count below 5; larger sparse tables keep the chi-square and the panel supplies the exact p-value to quote instead. If you previously quoted a p-value from a sparse 2x2, re-check it - the exact test can fall on the other side of 0.05. -
Arc Diagram: weighted centrality used a non-standard transform. Edge strengths were converted to distances by a linear reflection rather than the reciprocal, so betweenness and closeness could name a different node as the network hub. Now uses
1/w, the published convention. Negative and zero weights previously aborted the analysis with a raw C-level igraph error and are now rejected with an explanation. -
Numbers were printed at full precision throughout the module.
@import jmvcoreplaces jmvcore’s ownformat()- a string-template helper that ignoresdigits,big.markand friends - ahead ofbase::format()for the whole package. Summary tables read “Y Mean 19.8349757678086” and trend text read “0.829075514952931 unit increase”; thousands separators were dropped. Corrected at 97 call sites. - Line Chart and Automatic Plot Selection over-reported N. Both counted rows rather than usable observations, so 180 rows with 155 usable outcomes was reported as “180 of 180”. Exclusions are now counted correctly and itemised.
-
Automatic Plot Selection: random subsampling is disclosed. With
sampleLargeenabled, every statistic is computed on a random subset; the panel previously showed only a reduced row count, which reads like missing-data exclusion, and the explanation went to the R console. Discarding rows costs power - measured over 300 replicates at d = 0.05 with n = 30,000, full-data power 99.7% against 45.3% on the 5,000-row draw.
Fixed
-
Line Chart crashed on infinite values.
complete.cases()keepsInf, which reachedvar(y) == 0, whereNaN == 0isNAandif (NA)aborted the run with “missing value where TRUE/FALSE needed”. Non-finite rows are now excluded and the exclusion disclosed. -
Segmented Total Bar Charts crashed on any continuous Value Variable -
sprintf("%d")on a fractional total, outside every guard, at default settings. - Degenerate inputs that used to run silently now explain themselves: a single distinct X value (Line Chart), an empty dataset (Line Chart), a variable crossed with itself (Pie Charts), a one-group comparison and a constant outcome (Automatic Plot Selection, where a constant numeric was silently re-read as categorical and changed the analysis type), and a counts variable summing to zero (Bar Charts).
- Malformed “Expected proportions” were applied silently. In Bar Charts and Pie Charts the validation ran during plot rendering, where jamovi discards notices, so a wrong length, a non-numeric entry or a set that did not sum to 1 fell back to equal proportions with nothing on screen.
-
Generated syntax was invalid for awkward column names. Pie Charts emitted
dep = Tumor Grade ("high")unquoted; variable names are now escaped. -
Two shipped datasets could not be loaded by name.
statsplot2_repeated.rdaheld an object calledrepeated_measures_dataandstatsplot2_clinical.rdaheldclinical_trial_data, sodata(statsplot2_repeated)succeeded and the object still did not exist. Fixed, along with 29 others across the umbrella package.
Documentation
Vignettes are pkgdown articles only — vignettes/ is in .Rbuildignore, so they are not built by R CMD build. The %\Vignette* directives and vignette: front-matter blocks have been removed from 17 files accordingly; four of them declared a quarto::html engine whose package was not even in Suggests.
- New article “What’s New in jjstatsplot 1.0.52”, covering the new analysis, the breaking changes, and the analyses that do not yet have a walk-through of their own.
-
jjridgesdocumentation rewritten from scratch. It had been written against the option names ofjjridgestats(dep,group,plotStyle,scaling,colorscheme,mytitle), none of which exist injjridges— every example on the page failed. The replacement documents the real API, including thex_var(continuous) /y_var(grouping) split that is the reverse of what a box plot uses. -
Upstream ggstatsplot argument names removed from 14 articles. Examples used
type,title,subtitle,xlab,ylab,pairwise.comparisons,conf.level,x,y,idandpaired— the names of the wrapped functions, not of these wrappers — so copying them into R failed. They now usetypestatistics,mytitle,xtitle,ytitle,pairwisecomparisons,conflevel,dep/groupanddep1/dep2. The mapping was applied per function:jjhistostatsandjjcorrmatgenuinely havetitle,subtitleandxlab, and were left alone. Arguments with no equivalent at all (jjbarstatsandjjpiestatshave no title options) were removed rather than renamed. - The Line Chart article uses
showRefline = TRUEin every reference-line example. - Articles for analyses still in development —
bbcplots,advancedbarplot,economistplots,jsjplot,jjtreemap,basegraphics— each carry a notice saying so.
Articles removed or relocated
| Article | Action |
|---|---|
jjridgestats |
Removed — superseded by jjridges(). Not drop-in replacements. |
jjriverplot |
Moved to ClinicoPathDescriptives, where the analysis lives as riverplot() (13 of 14 documented arguments match). |
advancedtree |
Moved to meddecide, where the analysis lives as treeadvanced(). The article documents more options than are implemented; the notice lists which. |
jjsankeyfier, jjstreamgraph
|
Removed — no analysis of either name exists in any module. |
-
31-jjscatterstats-comprehensive.Rmdwas a single line of escaped text (literal\nand\"throughout) and could not render at all. Restored to 407 lines.
Known issues
-
The “Plot with Aesthetics” panel in Scatter Plot is always shown.Fixed. Thevisible:rule began with!, which fails jmvcore’s expression routing: the expression was handed back as a raw (truthy) string, so an empty aesthetics plot sat under every analysis. Now(colorvar || sizevar || shapevar || alphavar || labelvar). A sweep of all 19 shipped analyses found one more instance —enable: (!resultssubtitle)injjhistostats.u.yaml, which left that box permanently enabled — also fixed. - Five analyses have no dedicated vignette yet:
hullplot,jjdotchart,jjsegmentedtotalbar,raincloudandstatsplot2. Their option lists are documented in the new What’s New vignette.
jjstatsplot 1.0.4 (2026-08-07)
Note
-
No shipped analysis changed in this release. Between 1.0.2 and 1.0.4 every file belonging to the eighteen analyses distributed here — the ggstatsplot wrappers and the related plotting analyses (
advancedraincloud,hullplot,jjarcdiagram,jjbarstats,jjbetweenstats,jjcorrmat,jjdotplotstats,jjhistostats,jjpiestats,jjridges,jjscatterstats,jjsegmentedtotalbar,jjwithinstats,jwaffle,linechart,lollipop,raincloud,statsplot2) — was touched only by the version string. No backend (.b.R) file, no option (.a.yaml), results (.r.yaml) or interface (.u.yaml) definition was modified. Nothing a user can observe in the jamovi GUI or from the R wrappers differs from 1.0.2; no statistical method, default, plot or output was altered. - The pre-release review pass carried out over this window covered the diagnostic-decision family (
meddecide) and the oncology-pathology family (OncoPath) — comparison of diagnostic tests, interrater agreement, swimmer plots, IHC heterogeneity and diagnostic meta-analysis. None of those analyses is shipped by this module, so none of the fixes or the accompanying breaking option changes reaches users ofjjstatsplot. They are described in the NEWS files of the modules that own them.
Known issues
-
The “Plot with Aesthetics” panel in Scatter Plot (
jjscatterstats) is always shown. Its visibility rule injamovi/jjscatterstats.r.yamlbegins with!((!is.null(colorvar) || ...)), and a leading!fails jmvcore’s expression-routing pattern: instead of being evaluated, the expression is handed back as a raw string, which is truthy, so the item is permanently visible. An empty aesthetics plot therefore sits under the analysis even when no colour, size, shape, alpha or label variable has been chosen. This is one instance of a defect confirmed across the umbrella package (26visible:/enable:expressions in 17.r.yamlfiles); it is tracked and not yet fixed here. Interface (.u.yaml) conditions are unaffected — those are evaluated by the jamovi frontend, which handles!correctly. -
jamovi/0000.yamladvertises five analyses this module does not contain.basegraphics,jjcoefstats,jjpubr,jjsyndromicplotandpcaloadingheatmapwere added to the module manifest, but none of their backend, header or definition files is distributed here, and all five still carry theJJStatsPlotTdevelopment menu group used to route a function away from the production menu while it is under modification. They cannot be instantiated and should be treated as absent. -
janitorandlabelledwere added to DESCRIPTIONImports. Neither is called by any file shipped in this module; they are collateral from the umbrella-wide dependency sync and are candidates for removal rather than a new capability.
jjstatsplot 1.0.2 (2026-08-03)
Fixed
-
Optional variables were required arguments of the R function. Ten analyses declared variables with no default in their jamovi option definition, which compiles to a bare parameter in the generated wrapper. Calling the analysis from R without one failed with
argument "X" is missing, with no defaultbefore the analysis could report its own message — including for plainly optional inputs such asjjhistostats(grvar =), the “Split By” grouping variable. These now default toNULL:advancedraincloud(x_var,y_var),jjarcdiagram(source,target),jjbarstats(dep,group),jjcorrmat(grvar),jjdotplotstats(grvar),jjhistostats(grvar),jjpiestats(dep),jjsegmentedtotalbar(fill_var,x_var,y_var),jwaffle(groups) andstatsplot2(dep,group). Behaviour in the jamovi GUI is unchanged; no statistical method was altered.
Note
- The pre-release review pass carried out this release covered the survival-family and diagnostic-decision analyses (
jsurvival,meddecide) and a package-wideformat()namespace fix in the umbrella package. No analysis shipped here was changed — none of the affected files is distributed to this module.
Added
-
Automated GitHub release (
.github/workflows/release.yaml). A push to the default branch touchingDESCRIPTIONorjamovi/0000.yamlcross-checks the two version strings, refuses to proceed if they disagree, and — if the tag does not already exist — tagsv<version>and publishes a release whose notes are the matching section of this file.
jjstatsplot 0.0.47 (2026-07-05)
Bug Fixes
-
Fixed a crash on labelled (SPSS/Stata) data.
haven::as_factor()is used byjjwithinstatsandjwaffle, buthavenwas missing from the packageImports. Because jamovi installs only a package’sImports, those analyses crashed on labelled data on a clean install.havenis now declared. - Declared additional plotting dependencies used via
::but previously undeclared:car,cowplot,e1071,ggExtra,ggprism,ggrepel,patchwork,viridisLite.
jjstatsplot 0.0.46 (2026-07-04)
This release consolidates all work from 0.0.32.66 through 0.0.46 into a single entry. The main themes are: a new “Important Information” notices system surfacing typed diagnostic messages across analyses; extensive input-validation and HTML-escaping hardening of the backends; multiple-endpoint-correction guidance for group comparisons; and dependency/infrastructure cleanup that raises the minimum jamovi version to 2.7.27.
New Features
“Important Information” Notices
-
NEW: Added an “Important Information”
Preformattedoutput (notices) that surfaces prioritized, typed messages (ERROR / STRONG_WARNING / WARNING / INFO) generated during the analysis to seven modules:-
Arc Diagram (
jjarcdiagram) -
Bar Charts (
jjbarstats) -
Pie Charts (
jjpiestats) -
Advanced Ridge Plot (
jjridges) — replaces the previous free-formNotices(Html, always-visible) output -
Waffle Charts (
jwaffle) -
Lollipop Chart (
lollipop) -
statsplot2 (
statsplot2)
-
Arc Diagram (
- Backends for
jjarcdiagram,jjbarstats,jjpiestats,jwaffle,lollipop, andstatsplot2gained a shared.addNotice()/.renderNotices()helper pair that accumulates notices and renders them safely, avoiding thejmvcore::Noticeserialization failure.
Multiple-Endpoint Correction Guidance (jjbetweenstats)
-
NEW results panels
mecGuidance,diagnostics, andclinicalSummary(allHtml):-
mecGuidancerenders step-by-step guidance for themultiEndpointCorrectionoption (none/bonferroni/holm/fdr), including the adjusted significance threshold and a family-wise error-rate inflation warning when multiple dependent variables are tested. -
diagnosticsrenders data-quality and assumption diagnostics. -
clinicalSummaryrenders a natural-language clinical interpretation. - Guidance and diagnostics are now rendered from
.run()into always-visible elements (viasetContent()), so they reliably appear and update when options change — fixing content that previously vanished on option-only changes because it was emitted only from the memoized.prepareData()path.
-
Enhanced Existing Modules
-
Bar Charts (
jjbarstats): input validation now rejects continuous variables used as categories, non-numeric or negativecountsvalues, and grouping variables with fewer than 2 categories; auto-selects Fisher’s exact test when appropriate; validates paired-data structure; validates and normalizes expected-proportionratiovalues (with warnings on parse errors); UI reorganized intoCollapseBox/Labelgroups. -
Between-Group Comparisons (
jjbetweenstats): UI reorganized intoCollapseBox/Labelgroups. -
Arc Diagram (
jjarcdiagram): added network-size notices (trivial / very-small / small / large network), density notices (high / sparse), self-loop detection and removal, and edge-aggregation reporting. -
Housekeeping across modules: descriptive text and option titles were rewritten to avoid the literal
%character (e.g. “100%” → “100 percent”, “Winsorize (5/95%)” → “Winsorize (5/95 percent)”, “Show CV% Bands” → “Show CV percent Bands”) for compatibility with the notices/preformatted output.
Security & Robustness
-
HTML escaping:
htmltools::htmlEscape()is now applied to all user-supplied values interpolated into HTML output — variable names, group and factor labels, baseline-group names, and network node names — acrosshullplot,jjarcdiagram,jjbarstats,jjbetweenstats,jjpiestats, and others, preventing HTML/script injection via malicious column names or factor levels. -
Safe formula construction:
jjbarstatsbuilds its counts formula (counts ~ var1 + var2) withjmvcore::composeTerm()instead of raw string pasting. -
Input validation:
jmvcore::reject()guards for empty datasets, missing/not-found variables, and no-complete-cases conditions acrosshullplot,jjarcdiagram,jjbarstats, and others. -
Shared helpers added to
R/utils.R:.escapeVariableNames(),.asSurvivalFormula()(extends the jmvcore 2.7.27asFormulaallow-list),.buildSurvivalFormula(), and the%notin%/%!in%operators.
Bug Fixes
-
Line Chart (
linechart): added the missingnaturalSummaryresults element that the backend calls viasetContent(), which previously caused an error (community contribution — PR #12 by G Chia). -
Between-Group Comparisons (
jjbetweenstats): fixed multi-dependent-variable plotting by passing the aesthetic symbol directly (y = y) instead ofy = !!yinside a plainlist(), which errored with “invalid argument type”. -
Histogram (
jjhistostats): fixed the conditional visibility of the grouped ggpubr plot (ggpubrPlot2) to use!is.null(grvar); renamed the ggpubr output titles to remove parentheses (e.g. “Density Plot (ggpubr)” → “Density Plot ggpubr”). -
Scatter Plot (
jjscatterstats): adjusted the grouped-plot (plot2) visibility condition.
Package Infrastructure
- Version bumped to 0.0.46 (Date 2026-07-04); minimum jamovi (
minApp) raised from 1.2.19 to 2.7.27. - DESCRIPTION
Importsreorganized one-per-line; addedDTandextrafont; movedggcorrplot,ggside,performance, andPMCMRplusfromImportstoSuggests. -
Added
ClinicoPath/waffletoRemotes(alongsidegastonstat/arcdiagram). - Switched to
Config/roxygen2/version: 8.0.0(fromRoxygenNote: 7.3.3).
jjstatsplot 0.0.32.66 (2026-01-01)
New Features
ggpubr Integration
-
NEW: Added publication-ready plot variants using
ggpubrpackage across multiple analyses-
jjwithinstats: Added ggpubr plot option for within-subjects/paired data
- Multiple plot types: boxplot, violin, paired (with connecting lines), line (mean trajectory)
- Journal-specific color palettes: JCO, NPG, AAAS, Lancet, JAMA, NEJM
- Options for statistical comparisons, individual trajectories, and overlay points
-
jjpiestats: Added modern donut chart variant
- Publication-ready donut charts with journal color palettes
- Clean, professional aesthetic for reports and publications
-
jjwithinstats: Added ggpubr plot option for within-subjects/paired data
Enhanced Clinical Workflow Features
Ridge Plots (jjridges)
-
NEW: Clinical analysis presets with automatic configuration
- Biomarker Distribution (nonparametric + Cliff’s delta)
- Treatment Response (violin plots + Bonferroni correction)
- Age by Disease Stage (parametric + Cohen’s d)
- Tumor Size Comparison (Hodges-Lehmann shift)
- Lab Values by Group (robust tests + Hedges’ g)
- Survival Time Distribution (median + quartiles)
- Added comprehensive help panels:
-
showAboutPanel: Interpretation guidance and clinical examples -
showAssumptions: Statistical assumptions and methodological notes
-
- Enhanced statistical warnings for repeated measures/longitudinal data
Pie Charts (jjpiestats)
-
NEW: Interactive guidance panels
-
showSummary: Natural-language summary suitable for copy-paste into reports -
showAssumptions: Detected violations and Fisher exact test recommendations -
showInterpretation: Effect size interpretation and clinical context
-
Segmented Total Bar Charts (jjsegmentedtotalbar)
-
NEW: Dual plot type support
- Traditional 100% stacked bars
-
Flerlage-style segmented total bars (Kevin Flerlage design)
- Emphasizes both totals and composition
- Customizable labels, colors, transparency
- Background box styling options
- Reorganized options for clearer workflow
User Experience Improvements
- Multiple analyses updated with improved default settings for cleaner initial plots
- jjwithinstats: Violin and boxplot defaults changed to
falsefor simpler initial view - jjpiestats: Proportion test and BF message defaults to
falseto reduce clutter - jjsegmentedtotalbar: Percentages, outlines, export_ready defaults to
false - jwaffle: Legend default to
false
- jjwithinstats: Violin and boxplot defaults changed to
- Enhanced explanatory text across multiple analyses
- Improved statistical assumption warnings (especially for repeated measures data)
Package Dependencies
-
Added
ggpubrto Imports for publication-ready plot variants -
Added
rstatixto Imports for enhanced statistical testing support
jjstatsplot 0.0.31.84 (2025-10-03)
New Features
Hull Plot Analysis
-
NEW: Added
hullplotmodule for cluster and group visualization- Creates polygonal boundaries around data points grouped by categorical variables
- Based on
ggforce::geom_mark_hull()function - Perfect for visualizing customer segments, patient subgroups, and data clusters
- Features include:
- Customizable hull concavity (0-2 range)
- Optional confidence ellipses
- Outlier detection
- Group statistics summary
- Natural language interpretation
- Multiple color palettes (default, viridis, Set1, Set2, Dark2, clinical)
- Multiple plot themes (minimal, classic, light, dark, clinical)
- Support for color and size variables
- Automatic fallback to convex hulls when V8/concaveman packages unavailable
jjstatsplot 0.0.31.57 (2025-09-03)
Release Highlights
- Early release for September 2025
- Comprehensive statistical visualization suite with 17+ analysis types
- Publication-ready plots with statistical annotations
Core Features
Distribution Analysis
-
jjhistostats- Histograms with Shapiro-Wilk test and robust measures -
jjridges- Ridge plots for multiple distribution overlay -
jwaffle- Waffle charts for part-to-whole visualization
Continuous vs Continuous
-
jjscatterstats- Scatter plots with correlation analysis -
jjcorrmat- Correlation matrices with significance testing
Categorical vs Continuous
-
jjbetweenstats- Between-groups comparisons (ANOVA, Kruskal-Wallis) -
jjwithinstats- Within-subjects comparisons (repeated measures) -
jjdotplotstats- Dot charts with confidence intervals -
raincloud- Basic raincloud plots (distribution + individual points) -
advancedraincloud- Enhanced raincloud plots with longitudinal support -
lollipop- Lollipop charts for ranked data
Categorical vs Categorical
-
jjbarstats- Bar charts with chi-square and Fisher’s exact test -
jjpiestats- Pie charts with goodness of fit tests -
jjsegmentedtotalbar- Segmented bar charts with totals
Dependencies
- R (>= 4.0.0)
- Core: jmvcore, R6, ggstatsplot
- Plotting: ggplot2, ggalluvial, ggside, ggcorrplot, ggdist, ggridges, ggrain
- Statistical: PMCMRplus, WRS2, BayesFactor, effectsize, performance, moments
jjstatsplot 0.0.3.90
- Added comprehensive vignette collection (40+ files)
- Improved documentation structure