Repository navigation
Releases
HVTI Recipes 3.1.10
A patch edition: the whole book re-rendered against the 2026-11-06 family releases, and new links to the template gallery and the Quick start.
Read it: https://ehrlinger.github.io/hvtiGraphics/
What moved
- Links. Every page's footer links the Quick start and the template gallery, and the closing chapter says what each is for (#111). The gallery links back.
- Output. No recipe's output changes. The "What this build used" table records the new versions and commits; the rest of the cache diff is regenerated table CSS ids, a few bytes in three
postagestampfigures, and the usual bytes in every PDF figure.
Rendered against
hvtiR 1.3.7, hvtiRutilities 1.5.21, TemporalHazard 1.3.0 (main), hvtiRtables 1.0.12, hvtiPlotR 2.8.21, ggRandomForests 4.0.0, randomForestSRC 3.10.0. HTML caches come from deep render 42223455097, except hv_tables, packages and temporal_diagnostics. The PDF caches come from a forced local rebuild against the same commits. See #112.
HVTI Recipes 3.1.9
A patch edition: the whole book re-rendered against the 2026-11-03 family releases and randomForestSRC 3.10.0.
Read it: https://ehrlinger.github.io/hvtiGraphics/
What moved
- Manuscript tables. A count cell now reads
145(73), without the space, ashvtiRtables1.0.12 writes it. The two17 (22%)cells left inhv_tablesbelong to the chapter's plaingtsummarycomparison table, on purpose. - Forest chapters. Under randomForestSRC 3.10.0 the
rf_*,varproandvarpro_partialfits move. Invarprothe housing-data selection gainsBsmt.QualGdand no longer keepsPID, the parcel identifier. No prose quotes a number that changed. - Temporal hazard chapters. Last-digit changes in the optimizer output and the time-0 hazard, from TemporalHazard 1.2.18.
- Typeface. The HTML figures in
balance,histograms,scatterandpostagestamphad last been drawn on a Mac. They now come from the CI deep render, in the book's usual typeface. Their text and data are unchanged.
Rendered against
hvtiR 1.3.6, hvtiRtemplates 1.5.5, hvtiRutilities 1.5.19, TemporalHazard 1.2.18, hvtiRtables 1.0.12, hvtiPlotR 2.8.21, randomForestSRC 3.10.0. HTML caches come from deep render 41637670390, except hv_tables, packages and temporal_diagnostics. The PDF caches come from a forced local rebuild against the same versions. See #108.
HVTI Recipes 3.1.8
A patch edition: three chapters re-rendered against the 2026-10-25 family releases, and one finding about the new role colors.
Read it: https://ehrlinger.github.io/hvtiGraphics/
The role colors change nothing here
hvtiPlotR 2.8.18 moved the event and censored colors to Paul Tol's red #CC3311 and blue #0077BB. No figure in the book uses them: they apply only through scale_fill_hv(), scale_color_hv() and hv_role_palette(), which no chapter calls. After a clean rebuild, 157 of 168 figure PDFs are pixel-identical to 3.1.7. The "vermillion" in the captions is hv_palette(), which did not change.
3.1.8
- Manuscript tables follow the house notation (#105). Under hvtiRtables 1.0.8 and later, medians print in brackets,
46 [30, 62], and p-values drop the leading zero,.5. The summary recipe and itsgtcomparison now ask for the bracket form, so the table agrees with the default footnote, "Median [15th, 85th percentiles]". The printedhv_tbl_summary()result carries a Variable column for checking the report view against the data;hv_man_table_jtcvs()andhv_man_table_save()drop it, so it never reaches a manuscript. - The scatter recipe explains the short y-axis title (#105). On a continuous panel
hv_eda()now usesy_labelas the plot title and puts only the trailing units on the axis, so "Ejection Fraction (%)" titles the panel and the axis reads%. Addlabs(y = ...)when the axis needs the full label. - The slide-fitting printout in Presentations reflects hvtiPlotR 2.8.16's 4.11 in panel box. The figures are unchanged.
Not yet refreshed
The two varPro chapters keep their 3.1.7 figures. ggRandomForests main has moved past the commit they were drawn with and redraws them noticeably; they will be re-rendered when ggRandomForests 4.0.0 releases. sibling-versions.json keeps ggRandomForests at that older commit on purpose, so the weekly version check keeps flagging the pending refresh.
Built against
hvtiR 1.3.3, hvtiPlotR 2.8.18, hvtiRutilities 1.5.13, hvtiRtables 1.0.11, TemporalHazard 1.2.16 and ggRandomForests 4.0.0 (99acd37), with randomForestSRC 3.9.0, varPro 3.3.0, mlbench 2.1-11, consort 1.2.4 and ggsci 5.2.0. sibling-versions.json records them. The changed chapters were rendered locally against the tagged releases, so their HTML figures are set in Helvetica rather than the CI build's Nimbus Sans.
HVTI Recipes 3.1.7
A patch edition with one correction you should know about, a new recipe on journal colour palettes, and a re-render against the family's current releases.
Read it: https://ehrlinger.github.io/hvtiGraphics/
A correction first
The JTCVS summary table in Manuscript tables had no p-values in 3.1.5 and 3.1.6 (#93). The table built with hv_tbl_summary(compare = "pvalue") printed an empty p-value column, and hv_test_footnotes_jtcvs() returned no footnotes, so the letters naming each test were missing too. The cause was the build, not the packages: the CI render that drew the chapter lacked broom, which gtsummary's comparison tests call through cardx, and the warning saying so was suppressed in the book. Both are restored (Wilcoxon rank sum for the continuous rows, chi-square for diabetes). If you copied that table's layout, the p-value column belongs in it. broom is now in the book's install line, because a fresh machine hits the same silent blank.
3.1.7
- A new recipe, "Journal palettes" (#91), in the colour chapter.
ggscipackages the palettes of NEJM, The Lancet, JAMA, BMJ, JCO, Science, Nature and Frontiers as ggplot2 scales; the recipe shows them side by side and says what each is for. It also reports a check under simulated red-green colour blindness: Lancet pairs red with green, BMJ's blue and purple nearly merge, and AAAS and Frontiers are weak, while JAMA, JCO and Nature hold up about as well as the house palette. None of the cardiothoracic journals (JTCVS, The Annals of Thoracic Surgery, EJCTS) has a palette, so the house palette stays the default there. - The box-plot jitter recipe sets its own seed (#93). hvtiPlotR 2.8.6 stopped the
sample_*()data generators from leavingset.seed()behind in your session, which is the right behaviour, and which showed that the recipe'sgeom_jitter()had been leaning on it. It now usesposition_jitter(seed = ), and the text says why. proc_means()prints the group's report statistics (#93). Under hvtiRutilities 1.5.2 its default adds the 15th percentile, median and 85th percentile; the data tables chapter describes the new default and the SAS-parity caveat.- The CONSORT diagram is redrawn under consort 1.2.4, which changed its layout. The counts are unchanged.
- The version check now watches
ggsciandconsortalongside randomForestSRC, varPro and mlbench.
Everything else is unchanged: 160 of 168 HTML figures are pixel-identical to 3.1.6.
Built against
hvtiR 1.2.7, hvtiPlotR 2.8.6, hvtiRutilities 1.5.2, hvtiRtables 1.0.3, TemporalHazard 1.2.15 and ggRandomForests 4.0.0 (3753051, v4.0.0-rc8), with randomForestSRC 3.9.0, varPro 3.3.0, mlbench 2.1-11, consort 1.2.4 and ggsci 5.2.0. sibling-versions.json records them. The HTML cache comes from a CI build against those versions; the PDF was rebuilt locally against the same commits.
HVTI Recipes 3.1.6
A patch edition with one correction you should know about, a new recipe on numbering figures and tables, and figures that now come out the same however and wherever the book is built.
Read it: https://ehrlinger.github.io/hvtiGraphics/
A correction first
The varPro chapter's "recurrence" figure showed the wrong class (#86). On a two-level outcome, varPro::ivarpro() explains the first level, here N (no recurrence), and ggRandomForests filed that profile under the last level, R. So the figure captioned as recurrence showed positive lymph nodes lowering the probability of recurrence, which is the no-recurrence profile with its sign reversed. ggRandomForests now derives the recurrence profile exactly (ehrlinger/ggRandomForests#316), and the figure shows what its caption says: the forest's recurrence probability rises with node count. If you copied that figure or its reading into anything, recheck it. The chapter also explains which_class properly now, and the class-conditional plot labels its panels N and R instead of varPro's internal 0 and 1 (ehrlinger/ggRandomForests#315).
3.1.6
- A new recipe, "Numbering figures and tables" (#83), in the publications part. Quarto numbers a figure only when it has a
fig-label and afig-cap, and a table only with atbl-label andtbl-cap; the recipe covers that, computed captions, and the other ways a figure quietly loses its number. - The house percentile box (#80).
boxplots.qmddocuments the boxggRandomForests::gg_varpro()draws, with hinges at the 15th and 85th percentiles, whiskers at the 5th and 95th and no outlier points, beside the Tukey box it is easy to mistake it for. Ten chapters move to the house colour rule: the Okabe-Ito palette for groups in place ofSet1andDark2, andRdBuin place ofRdYlGnfor ordered scales. - The Sankey chapter teaches the new default palette (#85): Paul Tol's muted nine from hvtiPlotR 2.8.5, which hold up for red-green colour-blind readers, and the partial
node_coloursoverride. - Random-forest output is reproducible (#81, #82). A forest grown on several threads does not honour
set.seed(), so the same seeded fit gave a different answer on every run of the book's CI build. Every forest now grows on one thread. Two chapters had blamed that drift on the change of platform; they now name the real cause and showoptions(rf.cores = 1)as the fix in your own analyses. - Figures carry their exact colours (#84, #87). Built on a Mac, every HTML figure's colours had been shifted darker (the PDF's never were):
"firebrick"came out #A0111A instead of #B22222. HTML figures are now drawn withragg, which writes the exact values on every platform, and the whole HTML cache comes from one clean CI build against the versions recorded below. You will see slightly lighter, truer colours throughout.
Built against
hvtiR 1.2.5, hvtiPlotR 2.8.5, hvtiRutilities 1.4.4, hvtiRtables 1.0.3, TemporalHazard 1.2.12 and ggRandomForests 4.0.0 (c2e494d), with randomForestSRC 3.9.0, varPro 3.3.0 and mlbench 2.1-11. sibling-versions.json records them. The PDF is built locally and its figures are unchanged where its chapters were not re-rendered.
HVTI Recipes 3.1.5
A patch edition: a new chapter on designing slides, and the whole book re-rendered against the family releases of 2026-10-02.
Read it: https://ehrlinger.github.io/hvtiGraphics/
3.1.5
- A new chapter, "Designing slides" (#77). It sits immediately before
presentationsand gives the reasons behind its how-to: speaker, slide and audience as one system, how audiences process slides, and the house slide guidance it rests on. It also documents the light slide palette that shipped in hvtiPlotR 2.8.3. - Material from the April 2026 Research Day session (#78). The chapter gains:
- building the talk;
- slide habits from the session;
- delivery;
- questions and answers;
- links to the studies its claims rest on.
- Re-rendered against today's releases (#79). Every chapter executed with the freeze deleted, against hvtiR 1.2.5, hvtiPlotR 2.8.4, hvtiRutilities 1.4.4, hvtiRtables 1.0.3, TemporalHazard 1.2.12 and ggRandomForests 4.0.0. Nothing broke, and
sibling-versions.jsonrecords those versions. Only the HTML figures were re-rendered; the PDF figures in the freeze are unchanged from 3.1.4.
HVTI Recipes 3.1.4
A patch edition. It also covers 3.1.3, which was merged (#73) without a tag or release, so these notes run from the last release, 3.1.2.
Read it: https://ehrlinger.github.io/hvtiGraphics/
3.1.4
- The function map counts code, not mentions (#74). A chapter used to count as a worked recipe for a function if its prose merely named it. Now only R code blocks count. That took 18 functions off chapters that only mentioned them, and showed that
hv_ph_location()had no code anywhere in the book. - A worked recipe for
hv_ph_location()(#75): "The same panel position on every slide", inpresentations. It shows how to land every plot's panel at the same slide position when axis labels differ in width. The function map reads 85 of 85, with code behind every entry. - Smaller fixes (#74):
nnt: three colour scales that did nothing are removed.temporal_prediction: says which scalese.fitis on, and thatconf.typegoverns the survival limits only.
3.1.3
- Rebuilt against ggRandomForests 4.0.0-rc7 and hvtiPlotR 2.8.2 (#73), with TemporalHazard 1.2.12, from a SHA-pinned private library.
- Refit-based uncertainty bands for partial dependence (#72).
barlegends match the stack again (#70, hvtiPlotR 2.7.17).- The version record covers the CRAN packages that shape output (#70): randomForestSRC, varPro and mlbench, and the weekly check compares them against CRAN.
HVTI Recipes 3.1.2
A patch edition covering the PRs merged since 3.1.1 (2026-09-04, #56–#67). No chapters or parts were added or moved.
Read it: https://ehrlinger.github.io/hvtiGraphics/
What changed for readers
- The whole book was re-rendered against the current hvtiR family (#65): hvtiR 1.2.1, hvtiPlotR 2.7.15, hvtiRtables 1.0.2, hvtiRutilities 1.4.0, TemporalHazard 1.2.11 and ggRandomForests 4.0.0. The re-render exposed and fixed:
bar: the NYHA palette flipped under hvtiPlotR 2.7.15, drawing class IV green. Colours are now pinned to each class by name.hv_tables: a pitfall saidhv_man_table()prints77 ||| …literally, which has been false since hvtiRtables 0.9.7. It now covers the Overall column instead.temporal_migration: the translator no longer mapsCONDITION=14, and theDELTArow is now planned. The prose says both.
- Numbers at risk for the NNT chapter (#66): NNT estimated from Kaplan-Meier curves on patient records, with a two-arm risk table counted from the same records. At 20 years the table shows only 2 SVG patients behind the estimate.
- Partial dependence is described as a model summary (#65), not an adjusted or causal dose-response.
- A voice pass across 37 chapters (#65), plus smaller factual fixes in
sankey,rf_dependence,rf_shap,balance,boxplots,nntandlegends.
Upstream fixes found along the way
- ehrlinger/hvtiPlotR#156 (merged):
hv_atrisk_compose()clipped the first and last rows of a multi-strata table. - ehrlinger/hvtiPlotR#155 (open): stacked-bar legends list levels in the opposite order to the stack.
Earlier in this edition: #56 to #63 covered label_map()'s four columns, the mlbench data change, declaring ggraph, moving the function map out of the freeze, rf_vimp reproducibility notes, and the twelve-package family page.
v2.0.0 — second edition
Second edition of the HVTI ggplot graphics recipes book. New varPro partial-dependence and presentations chapters; rfsrc-scale varpro data and a Pima-diabetes ROC; numbers-at-risk composites and the canonical cluster Sankey + milestone alluvial from hvtiPlotR 2.5/2.6; a house figure-conventions pass; and PR render-check CI. Read it: https://ehrlinger.github.io/hvti_graphics/
v1.0.0 — first complete edition
First complete edition of the HVTI ggplot graphics recipes book.
- Full figure catalog plus random-forest and varPro recipes (new:
gg_partial_varpro,gg_udependent). - Migrated
hazard.qmd/nnt.qmdto thehv_*S3 constructors. - README + CC BY 4.0 license.