Skip to content

Roadmap: ggtaichi after 0.3.0 — consolidated plan and the research behind it #7

Description

@PursuitOfDataScience

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.

  1. 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.
  2. 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.
  3. 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).
  4. 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.
  5. 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.
  6. 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.
  7. 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.
  8. 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.

  1. The rank caveat and the is.ordered() branch — shipped code is
    currently misleading, and both are one-liners.
  2. taichi_seriate() with its temporal guard — the most-supported feature
    in the document.
  3. 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.
  4. taichi_describe() — four independent justifications, no dependency.
  5. 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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions