docs: add library expansion roadmap#5951
Merged
Merged
Conversation
Strategic overview ranking language and library candidates by estimated global charting demand, with concrete priorities for moving anyplot beyond Python (Tier 1: Chart.js, D3.js, ECharts; Tier 2: ggplot2, Plotly.js, Highcharts JS). Flags the three current Python entries (Plotly, Highcharts, lets-plot) that are non-native bindings and recommends migrations under the "native / most-used variant only" rule.
Contributor
There was a problem hiding this comment.
Pull request overview
Adds a new concept document that outlines a proposed roadmap for expanding anyplot beyond Python into a multi-language gallery, including a prioritized list of target libraries and open decision points for the team.
Changes:
- Introduces a market-estimate-driven prioritization of languages and charting libraries (JS/TS, R, later Julia/JVM/.NET).
- Documents a “cross-language library” policy application (e.g., Plotly/Highcharts placement) and a phased rollout plan.
- Captures open questions for team alignment (Highcharts migration approach, React-only libraries, TS vs JS registry stance, commercial licenses).
Comment on lines
+8
to
+11
| > **Note on numbers.** The percentages below are *estimates* synthesised from | ||
| > public signals (Stack Overflow Developer Survey, PyPI/npm download counts, | ||
| > GitHub stars, Google Trends, JS Rising Stars). They are good enough to | ||
| > prioritise — they are not authoritative market shares. |
Comment on lines
+19
to
+29
| | # | Library | Native language | In anyplot as | Notes | | ||
| |---|------------|-----------------|---------------|--------------------------------------------------| | ||
| | 1 | Matplotlib | Python | Python | True native. | | ||
| | 2 | Seaborn | Python | Python | Built on matplotlib. | | ||
| | 3 | Plotly | JavaScript | Python | Python is a wrapper around `plotly.js`. | | ||
| | 4 | Bokeh | Python | Python | True native. | | ||
| | 5 | Altair | Python | Python | Python interface to Vega-Lite (JSON spec). | | ||
| | 6 | plotnine | Python | Python | Python port of R's `ggplot2`. | | ||
| | 7 | Pygal | Python | Python | True native. | | ||
| | 8 | Highcharts | JavaScript | Python | Python is a paid wrapper; native is JS. | | ||
| | 9 | lets-plot | Kotlin | Python | Kotlin/JVM core; Python is one of the front-ends.| |
|
|
||
| | Library | Share within R | Notes | | ||
| |-----------------|---------------:|-------------------------------------------------------------| | ||
| | **ggplot2** | ~70 % | The de-facto standard. R-native target #1. | |
| source form, or as two separate "languages" in the registry? (Recommend: | ||
| one — the file extension and tooling differ, but the library identity does | ||
| not.) | ||
| 4. **Commercial licenses.** Highcharts requires a paid licence for commercial |
Replaces the ambiguous "native or most-used" rule with a single quantitative criterion: a binding qualifies as the canonical entry if it has >=3x more weekly downloads than every other variant; otherwise default to the native implementation. Consequences: - Plotly stays in Python (PyPI ~22x npm) - lets-plot stays in Python - Highcharts is the only existing entry that moves (to JavaScript) - Plotly.js drops out of Tier 2 (one entry per library) - Phase 2 only adds Highcharts JS as a replacement; cumulative count after Phase 3 is now 13, not 14
JS and TS share the same library APIs and TS is a syntactic superset of JS, so charting snippets can be authored once in plain JavaScript and used unchanged from TS. Documented authoring convention: plain JS by default, TSX only for libraries that are essentially never shown without it (Recharts). Resolves the corresponding open question by promoting it to a settled decision in section 6.
| ranks candidates by reach and integration cost, and recommends a concrete | ||
| priority order. | ||
|
|
||
| > **Note on numbers.** The percentages below are *estimates* synthesised from |
| > **Note on numbers.** The percentages below are *estimates* synthesised from | ||
| > public signals (Stack Overflow Developer Survey, PyPI/npm download counts, | ||
| > GitHub stars, Google Trends, JS Rising Stars). They are good enough to | ||
| > prioritise — they are not authoritative market shares. |
| | 6 | plotnine | Python | Python | Python | Sister library to ggplot2, not a wrapper. | | ||
| | 7 | Pygal | Python | Python | Python | Native = most-used. | | ||
| | 8 | Highcharts | JavaScript | Python | **JavaScript** | npm ~1 M / wk vs `highcharts-core` ~5 k / wk.| | ||
| | 9 | lets-plot | Kotlin | Python | Python | Python front-end has the most users today. | |
|
|
||
| | Library | Share within R | Notes | | ||
| |-----------------|---------------:|-------------------------------------------------------------| | ||
| | **ggplot2** | ~70 % | The de-facto standard. R-native target #1. | |
| 2. **React-specific libraries.** Recharts, Visx, Nivo only make sense if | ||
| anyplot intends to support framework-specific entries. If we keep entries | ||
| framework-agnostic, drop them and lean on Chart.js / ECharts. | ||
| 3. **Commercial licenses.** Highcharts requires a paid licence for commercial |
Comment on lines
+206
to
+207
| After Phase 3 anyplot covers ~95 % of global charting-library demand with 13 | ||
| entries. |
Comment on lines
+1
to
+5
| # Library Expansion Roadmap | ||
|
|
||
| Strategic overview for expanding anyplot beyond Python into a true multi-language | ||
| gallery. This document estimates the global market for charting libraries, | ||
| ranks candidates by reach and integration cost, and recommends a concrete |
React is a JavaScript library, not a language - JSX/TSX compiles to
plain JS. Same for Vue, Svelte, Angular. The framework requirement is
a runtime constraint, so model it on library metadata
('framework: none|react|vue|...') rather than as a separate
'language_id'. Keeps the registry simple, lets the frontend offer
dual filters ('all JS' / 'React-compatible'), and indexes
framework-locked libraries under both their language and framework
keywords for SEO.
Resolves the corresponding open question by promoting it to a settled
decision in section 6.
Adds a "Licensing policy" subsection: FOSS-first, with libraries that have a free-for-private-use tier (Highcharts, amCharts) allowed but tagged and never displacing FOSS alternatives at the same tier. Hard- paywalled libraries are out of scope. Suggests a 'license' metadata field per library and a "FOSS only" frontend filter. Promotes the Highcharts-migration and commercial-license open questions to settled decisions and reorganises section 9 into "Settled decisions" plus a much shorter "Open questions" list. Tier 2 entries now show their licence inline.
|
|
||
| ### Tier 2 — high value, slightly more work | ||
|
|
||
| 4. **ggplot2 (R)** — MIT/GPL-2. Unlocks the entire R / academic audience; |
| page. Suggested metadata field on each library: | ||
|
|
||
| ```python | ||
| "license": "MIT" | "Apache-2.0" | "BSD-3-Clause" | "ISC" | "GPL-2.0" |
Comment on lines
+261
to
+262
| After Phase 3 anyplot covers ~95 % of global charting-library demand with 13 | ||
| entries. |
Comment on lines
+1
to
+5
| # Library Expansion Roadmap | ||
|
|
||
| Strategic overview for expanding anyplot beyond Python into a true multi-language | ||
| gallery. This document estimates the global market for charting libraries, | ||
| ranks candidates by reach and integration cost, and recommends a concrete |
Comment on lines
+280
to
+284
| ## 10. Open questions for the team | ||
|
|
||
| 1. **Refresh cadence for the 3× threshold.** Download numbers shift over time. | ||
| Recommend re-checking the canonical-variant decisions once a year and on | ||
| any major release of a contender. |
Yearly review walks four signals: PyPI/npm download trends to re-run the 3x canonical-variant test, Plausible visitor data to see which existing entries actually draw traffic, a trend scan (JS Rising Stars, PyPI top-movers, GitHub Trending) for new contenders, and a tier reshuffle in section 7 based on the above. Off-cycle reviews triggered by a major release of an in-scope library or a clear emerging contender. Removes the corresponding open question; only the amCharts inclusion question remains.
Defines three scope criteria for any new language entry: code-driven (no GUI workflows), free toolchain (so CI can render previews and contributors avoid licence costs), and a public package registry. Explicitly lists tools that fail at least one criterion - Excel, Google Sheets, Tableau, Power BI, Looker, Qlik, MATLAB, SAS, SPSS, Stata, Mathematica, Origin, SigmaPlot, Prism - so the question doesn't get re-asked at every annual review. Reranks remaining candidates: Julia (Makie.jl) is the only clear "add later" entry; Swift Charts becomes an optional Phase 6 if Apple-platform audience matters; Kotlin/C#/Java/Go/Rust/F#/Scala are deferred or skipped.
|
|
||
| ### Tier 2 — high value, slightly more work | ||
|
|
||
| 4. **ggplot2 (R)** — MIT/GPL-2. Unlocks the entire R / academic audience; |
Comment on lines
+292
to
+293
| | 2 | Highcharts (replaces Python entry) | — | 12 | | ||
| | 3 | ggplot2 | + R | 13 | |
Comment on lines
+297
to
+298
| After Phase 3 anyplot covers ~95 % of global charting-library demand with 13 | ||
| entries. |
Comment on lines
+302
to
+333
| ## 9. Settled decisions | ||
|
|
||
| - **JS / TS treated as one language**, snippets authored in plain JS (TSX | ||
| only when a library is realistically only used that way, e.g. Recharts). | ||
| - **React / Vue / Svelte / Angular** are JavaScript with a `framework` | ||
| metadata flag, not separate languages. | ||
| - **Cross-language libraries** appear once, under the variant with ≥ 3× more | ||
| weekly downloads (else native). | ||
| - **Highcharts** moves from Python to JavaScript. Keep both entries for one | ||
| release as a deprecation window, then drop the Python entry. | ||
| - **Licensing**: FOSS-first; libraries with a free-for-private-use tier | ||
| (Highcharts, amCharts) are allowed but tagged and never crowd out FOSS | ||
| alternatives at the same tier. | ||
| - **Annual review cadence.** Once a year, revisit this document and check: | ||
| 1. **Downloads**: re-run the 3× test on every cross-language library; flip | ||
| canonical variants where the gap has reversed. | ||
| 2. **Visitor data** (Plausible): which libraries / plot pages drew the most | ||
| traffic? Promote rising entries in the recommendation tiers; demote ones | ||
| nobody visits. | ||
| 3. **Trend scan**: JS Rising Stars, PyPI top-movers, GitHub Trending in | ||
| `data-visualization`. Add anything that has clearly broken into the | ||
| mainstream and isn't already covered. | ||
| 4. **Tier reshuffle**: update §7 priority order accordingly. | ||
|
|
||
| An off-cycle review is also triggered by a major release of an in-scope | ||
| library or a clear emerging contender. | ||
|
|
||
| ## 10. Open questions for the team | ||
|
|
||
| 1. **amCharts inclusion.** Same licence model as Highcharts. Add as a Tier 3 | ||
| entry, or skip on the grounds that Highcharts already covers the | ||
| "commercial, free for private" niche? |
Comment on lines
+145
to
+151
| A library that exists in many languages appears **exactly once**, under the | ||
| **most-used variant**. "Most-used" is decided quantitatively: | ||
|
|
||
| > A binding qualifies as the canonical entry if it has **≥ 3× more weekly | ||
| > downloads** than every other variant. Otherwise default to the native | ||
| > implementation. | ||
|
|
amCharts duplicates Highcharts' commercial-with-free-tier slot at ~18x lower download volume; a second commercial entry would weaken the FOSS-first stance set in section 6. Revisit only if Plausible data shows unmet demand for amCharts-specific examples. Section 10 is now empty - new questions surface through the annual review.
Correctness fixes: - ggplot2 license: was "MIT/GPL-2", corrected to "MIT" per current CRAN DESCRIPTION - License metadata example now uses valid SPDX identifiers (GPL-2.0-only / GPL-2.0-or-later) and a LicenseRef-Commercial-Free- NonCommercial form for the Highcharts/amCharts case - §6 "exactly once" rule now explicitly notes the deprecation-window exception used for the Highcharts move - §8 phased rollout adds a callout explaining why Phase 2 ships Highcharts before the higher-ranked ggplot2: Phase 2 reuses the JS pipeline from Phase 1, ggplot2 requires a brand-new R runtime Discoverability: - Add docs/concepts/library-expansion.md to docs/index.md (Concepts section + Documentation Structure tree) Style consistency (repo uses American English): - synthesised -> synthesized, prioritise -> prioritize, prioritises -> prioritizes - front-end -> frontend - de-facto -> de facto - licence -> license throughout Skipped: nothing - all 21 review comments dedupe to ten distinct issues, all addressed above.
Comment on lines
+246
to
+248
| Net effect on the existing catalogue: **only Highcharts moves.** Plotly and | ||
| lets-plot stay where they are because their Python variants outweigh the | ||
| native versions by more than the 3× threshold. |
Comment on lines
+315
to
+316
| After Phase 3 anyplot covers ~95 % of global charting-library demand with 13 | ||
| entries. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Strategic overview for expanding anyplot beyond Python into a true multi-language gallery. Estimates the global charting-library market and recommends a concrete priority order.
Key findings
After Phase 3 anyplot covers ~95 % of global charting demand with 13 entries.
Settled design decisions (§9 in the doc)
frameworkmetadata flag, not separate languages. Frontend exposes a framework filter.licensemetadata field uses valid SPDX identifiers (GPL-2.0-only/GPL-2.0-or-later, …) plus aLicenseRef-Commercial-Free-NonCommercialform for commercial-with-free-tier libraries. Hard-paywalled libraries are out of scope.Open questions
None — §10 is now empty. New questions surface through the annual review.
Test plan
https://claude.ai/code/session_01A9yaZzBa3zR4W7KHs9ruH6
Generated by Claude Code