Changelog
Source:NEWS.md
hvtiPlotR 2.3.3
Bug fixes
-
save_ppt(): the white box behind plots is gone again. The earlier fix only cleared the officer placeholder’s fill;rvg::dml()still defaults tobg = "white", so the DrawingML graphic painted its own opaque white canvas rectangle behind the (transparent) plot. Bothdml()calls (plots and consort diagrams) now passbg = "transparent", so the slide-template background shows through cleanly on dark/blue decks. -
theme_hv_ppt_dark()andtheme_hv_ppt_light()now default tobase_family = "Arial",base_size = 32, with Arial 32 Bold axis tick labels and Arial 40 Bold axis titles — matching the canonical CORR deck (driveline-infections, slide 6). Axis titles scale atbase_size * 1.25. (Slide-title fonts are controlled by the PowerPoint template, not the theme.) Override at the call site as usual, e.g.theme_hv_ppt_dark(base_size = 28).
Changes
-
save_ppt()now defaultspanel_boxto the standard CORR fixed-panel rectanglelist(width = 8.88, height = 4.51, left = 2.58, top = 1.63), so every deck anchors the plot panel at the same slide coordinates by default (AATS-style placement). Passpanel_box = NULLto restore the legacy fixed-width/height/left/topplacement. Because the default now routes plots throughhv_ph_location(), save_ppt suppresses the benign “font family ‘Arial’ not found in PostScript font database” warning from the grob-measurement device (the slide graphic still embeds Arial via systemfonts).
Documentation
-
save_ppt()examples now show the recommended preview-light / save-dark workflow (build withtheme_hv_ppt_light()for the IDE viewer, swap totheme_hv_ppt_dark()before saving) and add a no-y-axis-label slide (labs(y = NULL)). - Dropped the
family = "mono"snippet from the theme docs and switched the executed Kaplan–Meier examples off the Arial PPT themes (totheme_hv_poster()), soR CMD checkexamples stay warning-free on hosts without Arial installed (a cause of the failing CI run). - Declared
xml2inSuggests(used by the save_ppt white-box test), fixing the “unstated dependencies in ‘tests’” check WARNING. - Added a small (~16 KB) dark-background test template at
inst/extdata/hv_ppt_template.pptx, derived from the canonical CORR deck (master, layouts, and theme only — content slides, notes, comments, media, and document metadata stripped). Reach it withsystem.file("extdata", "hv_ppt_template.pptx", package = "hvtiPlotR")to trysave_ppt()against an authentic dark slide master.
hvtiPlotR 2.3.2
Documentation (#70)
- Vignette clarity pass: added structural grounding to all five vignettes — two to four sentences before every code chunk on what the recipe does, when to reach for it, and (for bare/raw plots) what to look for. Applied the
memory/vignette-clarity-pass.mdworkflow developed for TemporalHazard 1.0.3. - Corrected four factual claims surfaced by review: the dashed-threshold recommendation in the SAS migration guide (
geom_hline(), notannotate("hline")); thetheme_hv_poster()font claim (the theme does not enforce a sans-serif face); thetheme(legend.position = "none")layout-space claim (no space is reserved); and thetheme_hv_manuscript()“no title” claim (the theme does not blankplot.title).
hvtiPlotR 2.3.1
Documentation (#69)
- Package-wide voice rewrite of every prose surface — README, vignettes, NEWS, slide deck, roxygen, DESCRIPTION
Title:— against thewriting-voice.mdspec. Prose only; no API or behavioural change. - Fixed stale
hv_theme()string-key references ("dark_ppt","ppt","light_ppt","manuscript","poster") in the main tutorial and SAS-migration vignettes. That dispatcher was removed in 2.1.0; the vignettes now name the actualtheme_hv_*()functions. - Fixed missing “to” in the main tutorial’s introduction (“is simplify” → “is to simplify”).
- README now lists all five vignettes (
sas-migration-guidewas missing) and the “Migrating from plot.sas” section points at the dedicated migration vignette. - Synced a copy of
writing-voice.mdinto the repo root for future documentation work.
hvtiPlotR 2.3.0
CONSORT patient flow tracking and diagram (#67)
Two-class API for CONSORT flow diagrams built from patient-level data.
Tracker lifecycle:
-
hv_consort_start(data, patient_id, label, pass_col)— initialises a tracker with one row per patient; all patients begin as screened. -
hv_consort_exclude(tracker, label, col, ..., excl_label, pass_col)— adds an exclusion stage via formula rules (condition ~ "Reason string"). First-matching formula wins; gating on the prior stage is automatic. -
hv_consort_summary(tracker)— returns a data frame with N included and N excluded per stage; suitable for methods-section tables. -
hv_consort_patients(tracker, stage, reason)— returns patient IDs at any stage, or the subset excluded for a specific reason.
Diagram:
-
hv_consort(tracker, side_box, cex, width, height)— auto-derivesordersandside_boxfrom tracker metadata and callsconsort::consort_plot().side_box = "all"(default) includes every exclusion column; pass a character vector to select specific columns. -
plot.hv_consort(x)— renders the diagram via theconsortplot method. -
save_ppt()now acceptshv_consortobjects, producing an editable DrawingML vector object in the output.pptx.
Sample data:
-
sample_consort_data(n, seed)— reproducible three-stage cardiac surgery tracker for demos and testing.
Dependency: consort (>= 0.2.0) added to Imports.
Documentation
- New worked CONSORT Patient Flow Diagram section in the Plot Functions vignette, covering the tracker workflow, the rendered diagram, the audit helpers, and
save_ppt()export (#68). - New “What’s New in v2.x” slide deck shipped as Quarto source at
inst/slides/hvtiPlotR-whats-new.qmd— an onboarding overview of the v2.x API redesign, theme rename, and PowerPoint export, with a README “Slides” section pointing to it (#67).
hvtiPlotR 2.2.0
New S3 methods for hv_data objects (#64)
Three standard-R S3 verbs are now implemented for every hv_data subclass:
-
summary()— prints the standard one-screen header, then walks the object’s$tablesslot and prints each named auxiliary table with a header. Callers get risk tables, report tables, and diagnostics without reaching for$tablesdirectly. Subclasses can override with a curated layout. -
autoplot()— re-exports ggplot2’sautoplot()generic and dispatches to the registeredplot.<subclass>()method. Callers who prefer the ggplot2-ecosystem verb (broom,ggfortify, andggsurvfitall use it) can writeautoplot(km)in place ofplot(km). Extra args forward to the subclassplot(). -
as.data.frame()— returns the$dataslot via standardas.data.frame()coercion instead of the$dataaccessor.
No breaking changes.
UpSet plot backend swap (#62)
plot.hv_upset() is now backed by ggupset rather than ComplexUpset. The intersection-size bar chart is a standard ggplot; themes apply via +, and ggplot2::ggplot_build() works on the output. When set_size = TRUE (the default) a manual set-size sidebar is composed via patchwork.
Breaking changes:
- The
base_annotationsparameter has been removed. To recolour the intersection bars by an external grouping variable, passfill_col = "<column>"toplot(); for a single fixed colour passbar_fill = "<colour>". - The
min_sizeparameter has been replaced byn_intersections(top-N by frequency or degree — seesort_by). ComplexUpset’s size-threshold semantics are not preserved. -
encode_setsandsort_intersectionsparameters have been removed (the new equivalents aresort_byandset_size_sort). - Themes now apply via
+, not&.&still works on the patchwork composite whenset_size = TRUE.
Other changes:
- The
ComplexUpsetImport has been dropped;ggupset (>= 0.4.0)is added in its place.patchworkhas been promoted from Suggests to Imports. -
hv_upset()adds a.Procedureslist-column to its stored$dataforscale_x_upset()to consume. - The four
upset_*vignette chunks no longer carry a Windows skip gate; ggupset renders cleanly on every CI runner. -
tests/testthat/test_example_plot_data.Randtests/testthat/test_plot_integration.Rdrop theirtryCatch / skip_if_theme_incompatibilitywrappers — the upset output now passesexpect_plot_has_data()like every other plot.
hvtiPlotR 2.1.0
Theme API redesign
The four theme functions are now named
theme_hv_manuscript(),theme_hv_poster(),theme_hv_ppt_dark(), andtheme_hv_ppt_light(), matching ggplot2’stheme_bw()/theme_grey()naming.-
Each theme follows the
theme_bw()contract: passbase_size/base_familyto control typography, then forward any extra named theme element through...to override. Examples:theme_hv_manuscript(legend.position = "right") theme_hv_ppt_dark(axis.text.y = element_text(family = "mono")) The
hv_theme()dispatcher has been removed. Call the named theme function directly.The
bold = TRUE,mono_y = TRUE, andtitle_sizekwargs on the PPT themes have been removed. Express the equivalent overrides through...(e.g.axis.text = element_text(face = "bold")oraxis.text.y = element_text(family = "mono")).The previous names (
hv_theme_manuscript(),hv_theme_poster(),hv_theme_dark_ppt(),hv_theme_light_ppt(),hv_theme_ppt(),theme_man(),theme_manuscript(),theme_poster(),theme_ppt(),theme_dark_ppt(),theme_light_ppt()) remain as deprecated aliases that emit a one-shot deprecation warning and forward to the new theme function. Plan to remove in v3.0.0.
Tests
- Added
tests/testthat/helper-plot-data.Randtests/testthat/test_example_plot_data.R. Every@examplesand vignette plot path is exercised throughggplot2::ggplot_build(), asserting that non-decorator layers carry observation rows, expected geoms appear, and grouped/stratified plots preserve their groups. Catches the “plot rendered but contains no data” defect without a graphics device.
hvtiPlotR 2.0.1
Bug fixes
-
save_ppt(): theofficer::ph_location()call that places each plot on its slide now usesbg = "transparent"so the placeholder rectangle’s fill no longer shows up as an opaque white box behind the plot on dark PowerPoint templates. Previously, officer’s default ph_location shape had a white fill; against a blue-gradient slide template that appeared as a visible white rectangle larger than the ggplot panel. The ggplot itself is unchanged; only the containing shape’s fill is now transparent so the slide template background shows through any area outside the panel. -
hv_theme_light_ppt(): panel background is nowfill = "transparent"(was"white"). Saving alight_ppt-themed plot into a dark PowerPoint template previously showed as an opaque white rectangle inside the panel; with a transparent fill the slide template shows through. Add+ theme(panel.background = element_rect(fill = "white"))if you specifically need an opaque white panel.
Documentation
- Package-level help topic (
?hvtiPlotR) rewritten to cover the v2.0.0 feature set: two-step workflow with runnable example, fixed-panel geometry subsection (hv_ggsave_dims()/hv_ph_location()/save_ppt(panel_box=)), legacy single-call API,hv_dataclass introspection, scope and versioning, vignette index. - README “Utilities” table now lists
hv_ggsave_dims()andhv_ph_location(), and documentssave_ppt(panel_box=). -
save_ppt()example rewritten to show the recommendedhv_theme("light_ppt")preview workflow saving into a dark PPT template withpanel_box = list(width = 8.88, height = 4.51, left = 2.58, top = 1.29)and ascale_x_continuous(breaks = seq(0, 400, 100), expand = c(0, 0))decorator. -
hvtiPlotR.qmdcolour-guidance section updated to reflect that ColorBrewer palettes are accessed via ggplot2’s built-inscale_colour_brewer()rather than a directRColorBrewerdependency.
hvtiPlotR 2.0.0
First stable release of the hv_* API. This consolidates the 2.0.0.9001–2.0.0.9013 dev cycle into a tagged release that internal users can anchor against for bug reports and reproducibility. Subsequent releases will advance the semantic version (2.0.1, 2.1.0, 3.0.0) directly; no .9xxx pre-release suffixes.
New features — fixed-panel geometry
The dominant theme of this release is making the panel content area (the rectangular data region, excluding axes/titles/legend/margins) directly addressable, so figures stay visually aligned across output devices and across slides in a deck even when axis-label widths differ.
-
hv_ggsave_dims(plot, width, height, units = "in"): computeggsave()width/heightthat preserve a fixed panel content area regardless of surrounding chrome. Returns a named list shaped to splat intoggsave()viado.call(ggsave, c(list(filename = ..., plot = p), dims)). Units are length-only ("in","cm","mm") since the sizing device is PDF. -
hv_ph_location(plot, panel_width, panel_height, panel_left, panel_top, units = "in"): computeofficer::ph_location()width/height/left/topvalues that anchor a ggplot’s panel to a fixed rectangle on a slide, regardless of axis-label width. Measures asymmetric chrome (left/right/top/bottom of the panel) viaggplotGrob()and returns per-plot placement so the panel lands at the same slide coordinates on every slide. Warns if plot chrome extends past the left or top slide edge. -
save_ppt(..., panel_box = list(width, height, left, top)): new optional argument. When supplied, per-slide placement is computed viahv_ph_location()so every slide anchors the panel at the given rectangle; on dark PPT themes where the panel fill is visible, the panel no longer shifts between slides. Whenpanel_box = NULL(default), the fixedwidth/height/left/toparguments are used (legacy behavior).
New features — PPT theme polish
-
hv_theme_dark_ppt(bold = TRUE)andhv_theme_light_ppt(bold = TRUE): applyface = "bold"to axis text and axis titles.
Behaviour changes — PPT themes
-
hv_theme_dark_ppt()andhv_theme_light_ppt():- Legend is now hidden by default (
legend.position = "none"). PowerPoint figures are typically annotated directly on the panel; override with+ theme(legend.position = "right")when needed. - Axis ticks now face inside the panel (
axis.ticks.length = -half_line/2 pt) for the AATS-style inset look. - Axis-text and axis-title margins are now scaled from
base_sizevia ggplot2’shalf_line = base_size / 2convention, so spacing stays proportional whenbase_sizechanges. Previous unscaled defaults produced cramped labels atbase_size = 32. -
hv_theme_light_ppt()gains explicitaxis.text,axis.line,panel.background(fill"white", colour"black", linewidth 1), andaxis.tickselements so the light theme structurally mirrors the dark theme’s explicit-chrome approach (just with inverted colours).
- Legend is now hidden by default (
Build / infrastructure
-
.Rbuildignoreis now tracked in git (previously.gitignored). Three latent regex bugs fixed: anchored.gitignorepattern, stripped inline# ...comments from five patterns (which had silently never matched), and fixed^vignettes/*_files$→^vignettes/.*_files$so_files/output dirs actually get excluded from the build. -
vignettes/_quarto.ymlnow tracked withembed-resources: falseat the project level, making the small-HTML / separate_files/rendering behaviour explicit and preventing accidental repo bloat.
Dependency trim (from the merged trends_plots branch)
- Dropped
RColorBrewer(inline Set1 hex incluster_sankey_plot()and vignettes) andgridExtra(marrangeGrob()→patchwork::wrap_plots()in the EDA multi-panel PDF pattern) from Suggests. - Dropped
assertthatfrom Imports (save_ppt()now uses basestop()withcall. = FALSE). -
vignettes/hvtiPlotR.qmdnow documentshaven::read_xpt()(andhaven::read_sas()) for importing SAS data, with a CSV-fallback path for users without SAS access.
hvtiPlotR 2.0.0.9010
Bug fixes
-
plot-functions.qmd: UpSet plot chunks (upset_data,upset_basic,upset_fill,upset_era) now skip on Windows (eval: !expr .Platform$OS.type != "windows"). ComplexUpset’s patchwork rendering crashes the Rscript subprocess on the Windows CI runner (os error 232 / “pipe being closed”), so the examples are shown only on macOS and Linux where they render reliably.
hvtiPlotR 2.0.0.9009
Documentation
-
plot-functions.qmd: updated both mirror-histogram decorated examples to follow standard ggplot2 mirror-plot conventions:- Added
scale_y_continuous(labels = abs)so the y-axis displays absolute counts on both halves of the panel. - Replaced hard-coded y-coordinates in
annotate()calls withy = Inf/y = -Infplusvjust, anchoring each group label near the top/bottom panel edge regardless of dataset size. - Replaced hard-coded label strings (
"SAVR","TF-TAVR", etc.) withmh$meta$group_labels[1]/[2], so the annotations track the labels supplied to the constructor.
- Added
hvtiPlotR 2.0.0.9008
Documentation
- Vignettes: all
hv_theme("manuscript")calls inside R code blocks replaced withhv_theme("poster")to demonstrate non-default theme options. Prose references (e.g. migration guide comparison table) are preserved unchanged. Theme-specific sections inplot-decorators.qmd(## Manuscript,## Manuscript PDF) continue to demonstratehv_theme("manuscript"). -
plot-functions.qmd: added explicit Bare plot subsections to the six sections that previously chained directly from build to decoration — mirror-histogram (binary-match and IPTW), trends (cases/year), spaghetti, nonparametric temporal curve, nonparametric ordinal curve, and longitudinal participation counts. Each section now follows the three-step pattern:- build with
hv_*(), (2) render bare ggplot withp <- plot(obj), - decorate with
scale_*()+hv_theme("poster").
- build with
-
plot-functions.qmd: UpSet section split into## Bare plot(showingplot(hu)) and## Applying a theme(showingplot(hu) & hv_theme("poster")), with an explanatory note that the patchwork&operator is required.
hvtiPlotR 2.0.0.9007
Breaking changes
- All exported functions, S3 methods, and class names have been renamed from the
hvti_prefix to the shorterhv_prefix. No backward-compatible aliases are provided. Update all call sites:-
hvti_survival()→hv_survival() -
hvti_trends()→hv_trends() -
hvti_mirror_hist()→hv_mirror_hist() -
hvti_spaghetti()→hv_spaghetti() -
hvti_balance()→hv_balance() -
hvti_alluvial()→hv_alluvial() -
hvti_sankey()→hv_sankey() -
hvti_nonparametric()→hv_nonparametric() -
hvti_ordinal()→hv_ordinal() -
hvti_followup()→hv_followup() -
hvti_longitudinal()→hv_longitudinal() -
hvti_stacked()→hv_stacked() -
hvti_eda()→hv_eda() -
hvti_hazard()→hv_hazard() -
hvti_nnt()→hv_nnt() -
hvti_upset()→hv_upset() -
hvti_theme()→hv_theme() -
hvti_survival_difference()→hv_survival_difference() -
is_hvti_data()→is_hv_data() - Class strings
"hvti_*"→"hv_*"(affectsinherits()checks) - The package name (
hvtiPlotR) is unchanged.
-
hvtiPlotR 2.0.0.9006
Documentation
-
hv_mirror_hist()$tables$diagnostics: corrected return documentation from “a data frame of matched/unmatched counts per group” to accurately describe the actual type — a named list of diagnostic summaries whose contents vary by mode (binary-match vs weighted IPTW). All keys are now enumerated in the@returnblock. -
$metakeys inhv_mirror_hist()return docs updated to include all keys actually stored (score_col,group_col,match_colwere missing). - Added
@family Propensity Score & Matchingtohv_mirror_hist()andplot.hv_mirror_hist(), creating automatic bi-directional “See also” cross-links consistent with all otherhv_*constructor/plot pairs. -
plot.hv_mirror_hist()@returnnow describes composability with+(scales, limits, labels,hv_theme), matching the pattern used in all other updated plot methods. -
plot.hv_mirror_hist()@seealsoexpanded with descriptive text for each linked function, matching the richer pattern used elsewhere.
hvtiPlotR 2.0.0.9005
Tests
- Added
test_trends_plot.R(37 tests):$metaslot keys and values,$tables$summarystructure and row counts, factor level order preservation,print.hv_trendsoutput and invisible return, and full parameter coverage forplot.hv_trends(se,span,point_size,point_shape,alpha,smoother, grouped vs ungrouped mapping, composability withhv_theme). - Added
test_spaghetti_plot.R(25 tests):$metaslot keys and values,id_col/y_colabsent error cases,print.hv_spaghettioutput with and withoutcolour_colbranch and invisible return, and full parameter coverage forplot.hv_spaghetti(add_smooth,smooth_se,line_colour,line_width,alphaboundaries,y_labelserror cases,smooth_method, grouped vs ungrouped mapping, composability withhv_theme). - Added
test_hv_data.R(27 tests):new_hv_data()structure contract, input validation errors,is_hv_data()TRUE/FALSE for all relevant types,print.hv_database-class output and invisible return, subclass dispatch (verifyingprint.hv_spaghettioverridesprint.hv_data), andplot.hv_datafallback error with subclass name in message.
hvtiPlotR 2.0.0.9004
Breaking changes
-
hv_mirror()renamed tohv_mirror_hist()for naming consistency with the underlying plot type. The old name is registered as an@aliasesentry so?hv_mirrorstill resolves to the correct help page.
New features
-
hv_mirror_hist()is now searchable via?mirror_histogram,?hv_mirror,??propensity,??IPTW, and??matchingthrough@aliasesand@concepttags in its documentation.
Documentation
- All
hv_*constructors andplot.hv_*methods now carry@familytags; the help system and pkgdown reference both show bi-directional “See also” links between each constructor and its plot method. -
@returnon every constructor now explicitly says “callplot()to render” and links to the correspondingplot.hv_*method. -
@seealsoentries across all constructors and plot methods now include descriptive text explaining the role of each linked function. -
@examplesin all main plot methods include a\dontrun{}block demonstratingggplot2::theme_set(hv_theme_manuscript())for applying the publication theme globally,scale_colour_brewer()/scale_fill_brewer()for multi-group colour palettes, and a pointer tovignette("plot-decorators", package = "hvtiPlotR").
hvtiPlotR 2.0.0
Breaking changes — new S3 constructor API
All plot functions have been replaced by a two-step S3 workflow:
# Step 1: construct & validate
obj <- hv_*(data, ...) # returns c("hv_<concept>", "hv_data")
# Step 2: render
plot(obj, ...) + # bare ggplot — no scales, labels, or theme
scale_colour_manual(...) +
labs(...) +
hv_theme("manuscript")The old single-call functions (mirror_histogram(), survival_curve(), etc.) are removed. This is a clean break; no deprecated wrappers.
Constructor → old function mapping
| New constructor | Removed function(s) |
|---|---|
hv_mirror_hist() |
mirror_histogram() |
hv_balance() |
covariate_balance() |
hv_stacked() |
stacked_histogram() |
hv_survival() |
survival_curve() |
hv_nonparametric() |
nonparametric_curve_plot() |
hv_ordinal() |
nonparametric_ordinal_plot() |
hv_followup() |
goodness_followup() + goodness_event_plot()
|
hv_trends() |
trends_plot() |
hv_spaghetti() |
spaghetti_plot() |
hv_longitudinal() |
longitudinal_counts_plot() + longitudinal_counts_table()
|
hv_alluvial() |
alluvial_plot() |
hv_sankey() |
cluster_sankey_plot() |
hv_eda() |
eda_plot() |
hv_upset() |
upset_plot() |
hv_hazard() | hazard_plot() |hv_survival_difference() | survival_difference_plot() |hv_nnt() | nnt_plot() |The legacy hazard helpers (hazard_plot(), survival_difference_plot(), nnt_plot()) remain exported but are marked Superseded — use the S3 constructors above instead.
Multi-type constructors
Two constructors replace pairs of old functions via a type = argument on plot():
-
hv_longitudinal—plot(x, type = "plot")(bar chart, waslongitudinal_counts_plot()) orplot(x, type = "table")(text panel, waslongitudinal_counts_table()). -
hv_followup—plot(x, type = "followup")(death panel, wasgoodness_followup()) orplot(x, type = "event")(non-fatal event panel, wasgoodness_event_plot()).
New base class
- Added
hv_dataS3 base class (R/hvti-data.R). Everyhv_*constructor returnslist(data=, meta=, tables=)with classc("hv_<concept>", "hv_data"). -
new_hv_data()— internal constructor; validatesdata(data.frame),meta(named list),tables(list),subclass(character). -
print.hv_data()— fallback print method; shows class, dimensions, and slot names. -
plot.hv_data()— fallback plot method; stops with a helpful message if no concreteplot.hv_*()is registered. -
is_hv_data()— exported predicate.
Documentation
- Rewrote
help.Rpackage-level documentation to describe the new two-step constructor +plot()workflow and list allhv_*()constructors. - Updated
_pkgdown.ymlreference index: grouped by constructor family, withplot.*andprint.*S3 methods explicitly listed. - Updated all vignettes (
plot-functions.qmd,sas-migration-guide.qmd,plot-decorators.qmd) to use the new API throughout. - Updated
sas-migration-guide.qmdkey-concepts section and template reference table. - Fixed all stale
@seealsocross-references and orphaned old-API docblocks in every migrated R source file.
Tests
- Added
tests/testthat/test_hazard_plot.R— full validation suite forsample_hazard_data,sample_hazard_empirical,sample_life_table,hv_hazard,hv_survival_difference, andhv_nnt(column checks, CI bounds, layer structure, multi-group, non-default column names, input validation, print output, empirical/reference validation). - Added
tests/testthat/test_nonparametric_plots.R— full suite forsample_nonparametric_curve_data,sample_nonparametric_curve_points,nonparametric_curve_plot,sample_nonparametric_ordinal_data,sample_nonparametric_ordinal_points, andnonparametric_ordinal_plot. Includes probability-sum-to-1 invariant test for ordinal grades. - Added
tests/testthat/test_survival_derived.R— full suite forsample_survival_difference_data,sample_nnt_data, and legacysurvival_difference_plot/nnt_plot. Covers NA-NNT at t≈0 edge case and cross-function time-grid consistency. - Added
tests/testthat/test_cluster_sankey.R— full suite forsample_cluster_sankey_dataandcluster_sankey_plot. Validates the hierarchical merge tree (C9=A → C2=A) and that each Ck has exactly k levels. - Added
tests/testthat/test_pipeline.R— end-to-end pipeline tests coveringsurvival_curve → hv_theme → save_ppt, multi-slide list pipelines, built-in dataset usability,eda_classify_varedge cases (logical vector, all-NA, length-1), and composed multi-layer plots. - Added snapshot test to
test_kaplan_meier.Rforsurvival_curvereport_tableat fixed seed; added all-censored and single-observation edge-case tests. - Added snapshot test to
test_mirror_histogram.Rfor diagnostics at fixed seed. - Added
slide_titleslength-mismatch test totest_save_ppt.R. - Added
make_footnoteprefix-parameter tests totest_footnote.R.
Documentation
- Fixed
save_ppt()argument names throughout all vignettes:plot =→object =,filename =→powerpoint =. Also added correcttemplate =andslide_titles =arguments where missing. - Fixed critical roxygen bug in
sample_mirror_histogram_data(): doc block used##'(silently ignored by roxygen2) instead of#', so the function had no generated.Rdfile. Converted all##'→#', modernised\code{}→ backtick syntax, and added@examples. - Added
@examplesto all five theme functions:hv_theme(),hv_theme_manuscript(),hv_theme_dark_ppt(),hv_theme_light_ppt(), andhv_theme_poster(). - Expanded thin (2-line)
@examplesblocks for four sample-data helpers:sample_life_table(),sample_nonparametric_curve_points(),sample_nonparametric_ordinal_points(), andsample_longitudinal_counts_data(). - Fixed
km$survival_plotandkm$risk_tableaccessor patterns invignettes/plot-decorators.qmd:survival_curve()returns a ggplot with attributes, not a named list. Replaced withkm(the returned object IS the survival plot) andattr(km, "risk_table"). - Fixed patchwork operator-precedence bug in
vignettes/plot-decorators.qmd:p_ms | p_km_ms + plot_layout(...)→(p_ms | p_km_ms) + plot_layout(...). - Added
patchworktoSuggestsinDESCRIPTION(required byvignettes/plot-decorators.qmd). - Rewrote package-level help page (
help.R/?hvtiPlotR) to document all 57 exported functions, organised by category. - Expanded “Saving figures” section in
vignettes/sas-migration-guide.qmdwith correctsave_ppt()single- and multi-slide examples. - Added
ggplot2::geom_line(..., linewidth = 1.5)(replacing deprecatedsize =) and updatedremotes::install_github()(replacingdevtools::install_github()) invignettes/hvtiPlotR.qmd.
Input validation improvements
-
upset_plot()— added binary-column type check. ComplexUpset silently produces broken plots whenintersectcolumns contain non-binary values; the function now errors with a clear message listing the offending columns before handing off to ComplexUpset. -
sample_stacked_histogram_data()— addedstart_yearvalidation (previouslyn_yearsandn_categorieswere checked butstart_yearwas not; a non-integer or non-finite value produced silently nonsensical output). -
trends_plot()— movedmatch.arg(summary_fn)to after the data-frame and column checks, so users see a cleardata/ column error rather than an opaque'arg' should be one of...message when bothdataandsummary_fnare wrong. -
validators.R— added two scalar-parameter helpers:.check_scalar_positive()(finite, positive) and.check_scalar_nonneg()(finite, non-negative).cb_validate_params()incovariate-balance.Rnow delegates all four parameter checks to these helpers, eliminating 28 lines of bespoke validation code.
Architecture
-
.NP_SIMconstant list (nonparametric-curve-plot.R) — lifted the seven simulation tuning constants (eta_intercept,logit_shift,cont_baseline,cont_scale,cont_sigma,eff_frac_prob,eff_frac_cont) from local variables insample_nonparametric_curve_data()and from hard-coded defaults in.np_sample_bins()into a single file-level private list. Both functions now reference.NP_SIM$*— change once, updates all simulation paths.
Bug fixes / API consistency
-
Standardised
alpharange to[0, 1]across all plot functions. Previouslysurvival_curve(),covariate_balance(),mirror_histogram(),spaghetti_plot(), andgoodness_followup_death_plot()/goodness_followup_event_plot()used(0, 1](rejectingalpha = 0), whilealluvial_plot()used[0, 1]. All functions now accept[0, 1]—alpha = 0(fully transparent) is a valid ggplot2 value and should not be an error. -
Added
.check_alpha()shared validator inR/validators.R. Enforcesalpha ∈ [0, 1]withcall. = FALSEand is called from every plot function that accepts analphaargument. -
call. = FALSEsweep — everystop()call in the package now includescall. = FALSEso error messages never expose internal function names to callers. -
Expanded shared validators (
R/validators.R) to 11 files (up from 3). All ofalluvial-plot.R,covariate-balance.R,eda-plots.R,goodness-followup.R,hazard-plot.R,kaplan-meier.R,longitudinal-counts-plot.R,mirror-histogram.R,nonparametric-curve-plot.R,nonparametric-ordinal-plot.R,spaghetti-plot.R,stacked-histogram.R,trends-plot.R, andupset-plot.Rnow delegatedata.frame, column-presence, numeric-column, and alpha checks to.check_df(),.check_cols(),.check_col(),.check_numeric_col(), and.check_alpha(). Error messages use consistent wording across all entry points.
Code quality
- Named all simulation tuning constants in
sample_nonparametric_curve_data()and the internal helper.np_sample_bins():eta_intercept,logit_shift,cont_baseline,cont_scale,cont_sigma,eff_frac_prob,eff_frac_cont. Magic numbers replaced throughout the single-curve, multi-group, and binned-data-summary code paths. - Named all simulation tuning constants in
sample_nonparametric_ordinal_data()andsample_nonparametric_ordinal_points():a_first,a_step,eta_intercept. Every occurrence of-0.2,0.5, and1.2replaced by the named constant. - Extended edge-case test coverage:
-
test_kaplan_meier.R: added fivesurvival_curveerror tests for non-numerictime_col, invalidevent_colvalues (character instead of 0/1/logical), andalphaat 0, > 1, and < 0. -
test_hazard_plot.R: added graceful-handling test for an empty data frame (correct columns, zero rows) — confirms ggplot renders without error. -
test_mirror_histogram.R: added error test for non-numericscore_col.
-
hvtiPlotR 2.0.0.9000
- Added
eda_plot()— exploratory barplot/scatterplot for a single variable. Auto-detects variable type ("Cont","Cat_Num","Cat_Char") and dispatches to scatter + LOESS + rug (continuous) or stacked/filled bar (categorical).NAvalues are shown as an explicit"(Missing)"fill level. Returns a bare ggplot object for composition withscale_fill_*,scale_colour_*,labs(),annotate(), and [hv_theme()]. PortsFunction_DataPlotting()fromtp.dp.EDA_barplots_scatterplots.R. - Added
eda_classify_var()— replicates theUniqueLimittype-detection logic fromBarplot_Scatterplot_Function.R: classifies a vector as"Cont","Cat_Num", or"Cat_Char". - Added
eda_select_vars()— subsets and reorders a data frame by a character vector or space-separated string of column names. ReplacesOrder_Variables()and theMod_Data <- dta[, Order_Var]pattern fromtp.dp.EDA_barplots_scatterplots_varnames.R. - Added
sample_eda_data()— mixed-type cardiac-surgery registry simulation (binary, ordinal, character-categorical, and continuous variables) for demonstratingeda_plot()andeda_select_vars(). - Reorganised
inst/: movedpar_cst.xptandnpar_cst.xpttoinst/extdata/(standard R package location for bundled data files); removed unreferenced presentation and test artefacts (*.pptx,*.pdf,*.sasscratch files). - Extended
nonparametric_curve_plot()examples: added dual-Y-axis example (Example 10,\dontrun) usingscale_y_continuous(sec.axis = ...); notedcll_p95/clu_p95column availability for 95 % CI (Example 2) and per-group shape mapping viascale_shape_manual()(Example 4). - Extended
nonparametric_ordinal_plot()examples: added pre-operative severity comparison example grouping combined Mild/Moderate/Severe cohorts throughnonparametric_curve_plot(). - Split vignette into three:
hvtiPlotR.qmd(SAS migration guide),plot-functions.qmd(per-function reference with worked examples),plot-decorators.qmd(composition grammar:scale_*,labs(), themes, and saving to manuscript PDF, poster PDF, and editable PowerPoint viasave_ppt()).
hvtiPlotR 1.1.0
- Added
survival_curve()— Kaplan-Meier and Nelson-Aalen survival analysis returning five plot types (survival, cumulative hazard, hazard, log-log, life/RMST) plus risk and report tables. Ports the SAS%kaplanand%nelsontmacros fromtp.ac.dead.sas. - Added
sample_survival_data()— realistic exponential survival simulation with administrative censoring and optional treatment strata. - Added
goodness_followup()— goodness-of-follow-up scatter plot showing actual vs. potential follow-up per operation year, with optional non-fatal event panel. - Added
sample_goodness_followup_data()— simulates an operative cohort with operation dates, follow-up times, competing events, and death. - Added
covariate_balance()— standardised mean difference dot-plot for propensity-score matching or weighting diagnostics. - Added
sample_covariate_balance_data()— patient-level logistic simulation with greedy 1:1 caliper matching; SMDs computed before and after matching. - Added
stacked_histogram()andsample_stacked_histogram_data()— stacked or filled histogram of a numeric variable by group. - Improved
mirror_histogram()sample data (sample_mirror_histogram_data()) to use a realistic logistic propensity-score model with greedy 1:1 caliper matching and optional ATE IPTW weights; extreme-PS patients naturally go unmatched. - Added
hv_plot()dispatcher supporting"mirror_histogram","stacked_histogram", and"covariate_balance"plot types. - Added
hv_theme()dispatcher for"manuscript","ppt","dark_ppt", and"poster"themes. - Enabled roxygen Markdown (
Roxygen: list(markdown = TRUE)) so**bold**, backtick code spans, and[pkg::fn()]cross-references render correctly in Rd help pages. - Added
survivalto packageImports. - Updated package-level documentation (
help.R) to reflect all current exported functions and sample-data generators.
hvtiPlotR 0.2.2
- Fixed deprecated ggplot2 syntax (
size->linewidthinelement_lineandelement_rect). - Removed empty
save.hvtiplotrfunction. - Fixed
theme_dark_pptto pass all parameters totheme_grey. - Updated documentation for data objects.
- Updated README to reference
officerpackage instead of deprecatedReporteRs.