The research behind the releases after 0.3.0, and the plan that comes out of it.
Read this section and stop, unless you want the argument behind an item.
Ten literature passes each ended with their own prioritisation, which between
them re-ranked the same work nine times. What follows is the single
consolidated list. Section numbers (§n) refer to the full text in the comments.
69. What to build next
This section adds nothing. Ten passes each ended with a prioritisation delta
(§14, §24, §31, §37, §42, §47, §51, §56, §61, plus notes in the addenda), which
between them re-ranked the same items nine times and left no single place
showing what to do. This is that place. Where a later delta contradicts an
earlier one, the later one wins and the change is noted. Nothing below is new;
if an item here surprises you, the cross-reference is where it was argued.
No literature was consulted for this section. The one candidate found on
this pass — Lo et al. (2022), a taxonomy of 74 misleading-visualization
issues — turned out to restate §33.2, §34 and §54 rather than add to them, so
it is deliberately not cited above. Consolidation was the better use of the
pass.
Tier 0 — corrections to code that has already shipped
These are not features. Each is a defect or an unstated caveat in 0.3.0, all
are small, and they should go first because every one of them is currently
misleading somebody.
|
what |
where argued |
size |
| 1 |
rank needs a caveat. The widest gap in a 96-cell grid is frequently the largest noise, and taichi_summary() hands the extreme over in one line with no warning. |
§54, §55 |
one sentence |
| 2 |
is.ordered() for discrete fills. The automatic scale paints a sequential ramp on any factor, which asserts an ordering that an unordered factor does not have. |
§53, §55 |
one branch |
| 3 |
radius_exponent. The radius channel scales by sqrt(); cartography's answer for proportional circles is Flannery's ≈0.57, and 0.5 was a silent choice. |
§30 |
one argument |
| 4 |
Label the colour space in every number taichi_check_palette() prints. All of them are space-dependent and none says which space. |
§68 |
one line of output |
| 5 |
Trend caveat. Every bundled dataset is temporal and every example puts time on x; the grid encodes the series in colour, so slope is not encoded at all. |
§58 |
one paragraph |
Tier 1 — Wave 2, in dependency order
The ordering matters: several items are prerequisites for others, which none of
the nine deltas made visible.
taichi_seriate() via Suggests: seriation, with on = "difference",
a reported merit gain, and a temporal-axis guard (§22, §35, §60). Two
independent literatures support it — structure revelation and outlier
findability under attention limits — and it is the most-supported item in
the document. The guard is not optional: reordering a week axis destroys
the data, so it ships with seriation or seriation ships broken.
taichi_lineup() / taichi_rorschach() via Suggests: nullabor
(§39). Build it with seriation: reordering optimises an objective and will
find blocks in noise, and a Rorschach over seriated null data is the only
honest guard against that. The package-specific piece is the pairing
null, which no existing tool provides.
taichi_check() as linter-and-fixer (§21), now covering five
categories: data shape, presentation, inference (§39), things the mark
cannot show (§50), and multiplicity (§54). Every finding carries the call
that fixes it. Individual checks worth including, each a few lines:
proportional bias (§49), frame count (§44), missingness pattern (§67),
temporal axis (§58), cell-count/legibility (§17.3).
taichi_summary() as the abstract data model (§65) — add mean (§49),
observed as a four-level missingness factor (§67), and a traversal
order (§65). Document it as the model every other representation derives
from, not as a convenience function.
taichi_describe() / taichi_alt() with as = for placement (§19,
§36, §65). Four independent justifications: accessibility, colour naming,
machine readability, on-chart annotation. Depends on 4.
- Size-aware
taichi_check_palette(cell_size =) (§18), plus the surround
line and theme_taichi(panel_fill = "auto") (§27). No new dependency;
the renderer already resolves physical glyph size.
annotate_taichi_key() (§34) — onboarding is where the evidence says
the return is largest for an unfamiliar mark, and the README does not travel
with the figure.
vignette("design") (§13), which now has a great deal to say: mirror
symmetry (§17.1), ensemble coding (§17.3), Trumbo's four principles (§23),
the MCDA scoring table (§20), metaphor and valence (§33.2, §45), the
staging rule (§44), and "what this mark structurally cannot show" (§60)
— proportional bias, field-level agreement, within-row trend.
Also in Wave 2, independent of the above: HOPs for uncertainty (§23),
palette = "scientific" via Suggests: scico (§23), labels with
contrast-aware colour (§5), na_style with "omit" as the likely default
(§10, §67), stat_taichi() (§9).
Tier 2 — Wave 3, gated
- Settle the argument question first (§15 Q1, §40). The answer the evidence
supports: group only the genuine clusters (eyes, interactivity), keep
palette and explicit flat, and keep the flat path working
permanently — which the stable badge now also requires.
taichi_agreement(), all three branches together or not at all:
Bland–Altman for continuous (§49), kappa / weighted kappa / AC1 for
categorical (§53), the Taylor triple for the field (§59). Shipping one
branch makes the function misleading for the other inputs.
geom_taichi_ba() (§49), taichi_stage() (§44),
palette = "neutral" (§45), pattern fills, scatter placement (§6).
split (§8) — demoted twice. Its original justification (area outranks
colour) does not survive §26.2, and it should be scored under §20 and ideally
wait on the proxy measurement (§17.2) before anyone writes it.
Tier 3 — outside the package
The evaluation agenda (§63). Q1, Q2 and Q3 share one apparatus and are one
study with three conditions. Q1 is the one that matters: if the yin bulb's
position biases which fish reads as heavier, every taichi ever drawn has a
systematic asymmetry no palette check can detect. Q8, the VLM benchmark, needs
no participants at all. The package can ship the stimulus generator, and the
questions should be pre-registered.
Explicitly not planned
Everything on Part I's original list — plotly, a third fill channel,
reimplementing animation, a rendering engine, more than two sources — plus,
added since: a bespoke guide framework (compose legendry, §23),
automatic per-cell p-values (§56), audio synthesis in this package
(§65), and reimplementing the Taylor diagram (§59).
The five things that would change the package most
If the list above is still too long: these five, in order.
- The
rank caveat and the is.ordered() branch — shipped code is
currently misleading, and both are one-liners.
taichi_seriate() with its temporal guard — the most-supported feature
in the document.
taichi_check() — it is the delivery mechanism for a dozen findings
scattered across Parts II–IX, and the only place a user will ever encounter
most of them.
taichi_describe() — four independent justifications, no dependency.
- Q1 of the evaluation agenda — the only item that would let this package
make a claim about its own mark rather than borrowing one.
The full text
In the comments, ~4,400 lines in four parts:
- Part I (§1–§16) — the original catalogue: the survey, themes A–K, the
first prioritisation, and the open questions.
- Parts II–VI (§17–§48) — measurement of the encoding; corrections; the
mark's meaning and its novice reader; visual inference and API usability;
animated transitions and colour semantics.
- Parts VII–X (§49–§64) — agreement and method comparison; categorical
agreement and multiplicity; time-series structure and field summaries; the
evaluation agenda.
- §65–§71 — multimodal accessibility, missingness, colour space, the
candidates evaluated and rejected, and a 2026 result on glyph set size.
Roughly 70 works are cited, each checked against the primary source; CRAN
availability was verified against the live index.
Wave 1
Wave 1 shipped in 0.3.0 and #6 recorded it. The Tier 0 audit below then turned
up six defects in 0.3.0 itself, all fixed on main (0b678f5) — including a
legend order that was not deterministic between sessions, and an animations
vignette that had never rendered a frame.
The research behind the releases after 0.3.0, and the plan that comes out of it.
Read this section and stop, unless you want the argument behind an item.
Ten literature passes each ended with their own prioritisation, which between
them re-ranked the same work nine times. What follows is the single
consolidated list. Section numbers (§n) refer to the full text in the comments.
69. What to build next
This section adds nothing. Ten passes each ended with a prioritisation delta
(§14, §24, §31, §37, §42, §47, §51, §56, §61, plus notes in the addenda), which
between them re-ranked the same items nine times and left no single place
showing what to do. This is that place. Where a later delta contradicts an
earlier one, the later one wins and the change is noted. Nothing below is new;
if an item here surprises you, the cross-reference is where it was argued.
No literature was consulted for this section. The one candidate found on
this pass — Lo et al. (2022), a taxonomy of 74 misleading-visualization
issues — turned out to restate §33.2, §34 and §54 rather than add to them, so
it is deliberately not cited above. Consolidation was the better use of the
pass.
Tier 0 — corrections to code that has already shipped
These are not features. Each is a defect or an unstated caveat in 0.3.0, all
are small, and they should go first because every one of them is currently
misleading somebody.
rankneeds a caveat. The widest gap in a 96-cell grid is frequently the largest noise, andtaichi_summary()hands the extreme over in one line with no warning.is.ordered()for discrete fills. The automatic scale paints a sequential ramp on any factor, which asserts an ordering that an unordered factor does not have.radius_exponent. The radius channel scales bysqrt(); cartography's answer for proportional circles is Flannery's ≈0.57, and 0.5 was a silent choice.taichi_check_palette()prints. All of them are space-dependent and none says which space.Tier 1 — Wave 2, in dependency order
The ordering matters: several items are prerequisites for others, which none of
the nine deltas made visible.
taichi_seriate()viaSuggests: seriation, withon = "difference",a reported merit gain, and a temporal-axis guard (§22, §35, §60). Two
independent literatures support it — structure revelation and outlier
findability under attention limits — and it is the most-supported item in
the document. The guard is not optional: reordering a week axis destroys
the data, so it ships with seriation or seriation ships broken.
taichi_lineup()/taichi_rorschach()viaSuggests: nullabor(§39). Build it with seriation: reordering optimises an objective and will
find blocks in noise, and a Rorschach over seriated null data is the only
honest guard against that. The package-specific piece is the pairing
null, which no existing tool provides.
taichi_check()as linter-and-fixer (§21), now covering fivecategories: data shape, presentation, inference (§39), things the mark
cannot show (§50), and multiplicity (§54). Every finding carries the call
that fixes it. Individual checks worth including, each a few lines:
proportional bias (§49), frame count (§44), missingness pattern (§67),
temporal axis (§58), cell-count/legibility (§17.3).
taichi_summary()as the abstract data model (§65) — addmean(§49),observedas a four-level missingness factor (§67), and a traversalorder(§65). Document it as the model every other representation derivesfrom, not as a convenience function.
taichi_describe()/taichi_alt()withas =for placement (§19,§36, §65). Four independent justifications: accessibility, colour naming,
machine readability, on-chart annotation. Depends on 4.
taichi_check_palette(cell_size =)(§18), plus the surroundline and
theme_taichi(panel_fill = "auto")(§27). No new dependency;the renderer already resolves physical glyph size.
annotate_taichi_key()(§34) — onboarding is where the evidence saysthe return is largest for an unfamiliar mark, and the README does not travel
with the figure.
vignette("design")(§13), which now has a great deal to say: mirrorsymmetry (§17.1), ensemble coding (§17.3), Trumbo's four principles (§23),
the MCDA scoring table (§20), metaphor and valence (§33.2, §45), the
staging rule (§44), and "what this mark structurally cannot show" (§60)
— proportional bias, field-level agreement, within-row trend.
Also in Wave 2, independent of the above: HOPs for uncertainty (§23),
palette = "scientific"viaSuggests: scico(§23), labels withcontrast-aware colour (§5),
na_stylewith"omit"as the likely default(§10, §67),
stat_taichi()(§9).Tier 2 — Wave 3, gated
supports: group only the genuine clusters (eyes, interactivity), keep
paletteandexplicitflat, and keep the flat path workingpermanently — which the
stablebadge now also requires.taichi_agreement(), all three branches together or not at all:Bland–Altman for continuous (§49), kappa / weighted kappa / AC1 for
categorical (§53), the Taylor triple for the field (§59). Shipping one
branch makes the function misleading for the other inputs.
geom_taichi_ba()(§49),taichi_stage()(§44),palette = "neutral"(§45), pattern fills, scatter placement (§6).split(§8) — demoted twice. Its original justification (area outrankscolour) does not survive §26.2, and it should be scored under §20 and ideally
wait on the proxy measurement (§17.2) before anyone writes it.
Tier 3 — outside the package
The evaluation agenda (§63). Q1, Q2 and Q3 share one apparatus and are one
study with three conditions. Q1 is the one that matters: if the yin bulb's
position biases which fish reads as heavier, every taichi ever drawn has a
systematic asymmetry no palette check can detect. Q8, the VLM benchmark, needs
no participants at all. The package can ship the stimulus generator, and the
questions should be pre-registered.
Explicitly not planned
Everything on Part I's original list — plotly, a third fill channel,
reimplementing animation, a rendering engine, more than two sources — plus,
added since: a bespoke guide framework (compose
legendry, §23),automatic per-cell p-values (§56), audio synthesis in this package
(§65), and reimplementing the Taylor diagram (§59).
The five things that would change the package most
If the list above is still too long: these five, in order.
rankcaveat and theis.ordered()branch — shipped code iscurrently misleading, and both are one-liners.
taichi_seriate()with its temporal guard — the most-supported featurein the document.
taichi_check()— it is the delivery mechanism for a dozen findingsscattered across Parts II–IX, and the only place a user will ever encounter
most of them.
taichi_describe()— four independent justifications, no dependency.make a claim about its own mark rather than borrowing one.
The full text
In the comments, ~4,400 lines in four parts:
first prioritisation, and the open questions.
mark's meaning and its novice reader; visual inference and API usability;
animated transitions and colour semantics.
agreement and multiplicity; time-series structure and field summaries; the
evaluation agenda.
candidates evaluated and rejected, and a 2026 result on glyph set size.
Roughly 70 works are cited, each checked against the primary source; CRAN
availability was verified against the live index.
Wave 1
Wave 1 shipped in 0.3.0 and #6 recorded it. The Tier 0 audit below then turned
up six defects in 0.3.0 itself, all fixed on
main(0b678f5) — including alegend order that was not deterministic between sessions, and an animations
vignette that had never rendered a frame.