Dokumentation · Diagramm-Spezifikation
Ein JSON-Objekt hinein, ein Live-Diagramm heraus
Eine Spezifikation beschreibt alles, was die Engine zeichnet. Diese Seite ist die vollständige Referenz. Derselbe Vertrag gilt für Spezifikationen aus Makern, Einbettungen, MCP-Werkzeugaufrufen und der Render-API.
{
"type": "column",
"theme": "editorial",
"title": "Weekly signups",
"source": "Product analytics",
"data": {
"labels": [
"Mon",
"Tue",
"Wed",
"Thu",
"Fri"
],
"series": [
{
"name": "Signups",
"values": [
12,
19,
14,
27,
22
]
}
]
}
} Dieses Diagramm stellt genau diese Spezifikation live dar.
Die Struktur
Zwei Pflichtfelder, type und data, sowie sinnvolle Standardwerte für den Rest. Die meisten Typen verwenden Beschriftungen und Datenreihen. Die Statusmatrix benötigt data.columns und data.cells, die Live-Tabelle data.columns und data.rows. Hierarchie-, Rang-, Fluss-, Verteilungs- und X-Y-Typen verwenden die unten beschriebenen Formate. Unbekannte Diagrammtypen, fehlende Pflichtdaten und nicht numerische Werte werden mit strukturierten Fehlern abgelehnt; nichts scheitert unbemerkt. Bei Beschriftungen und Datenreihen hat jede Reihe genau einen Wert pro Beschriftung. Eine falsche Anzahl wird abgelehnt, niemals mit 0 aufgefüllt oder gekürzt. null bezeichnet eine Datenlücke: eine Unterbrechung der Linie, keinen Balken oder Punkt, No data im Tooltip und der verborgenen Tabelle. Bei number und dotplot ist dies nicht erlaubt.
| Feld | Erforderlich | Bedeutung |
|---|---|---|
type | ja | Einer der unten aufgeführten 27 Typen |
theme | nein, Standard: editorial | editorial · glass · ink · mint · neon. Unbekannte Namen verwenden editorial. |
data.labels | nein, Standard: 1, 2, 3… | Kategorienamen, einer pro Position |
data.series | ja | Mindestens eine Reihe { "name"?, "values": (number | null)[] } mit einem Wert pro Beschriftung. null ist eine Lücke. |
title, source | nein | Titel über und Quellenangabe unter dem Diagramm |
options.variant | nein | light · dark · auto. auto folgt zuerst der Dunkelmodus-Umschaltung der Host-Seite über data-theme, eine Klasse dark an html/body oder color-scheme, danach dem Betriebssystem, und wechselt live. Siehe Themes und Varianten. |
options.target | nein | Gestrichelte Referenzlinie über kartesischen Diagrammtypen |
options.precision | nein | Dezimalstellen (0–4) für Wertbeschriftungen, Tooltip und Kennzahl. Ohne Angabe bleiben die Dezimalstellen der Daten. |
options.format | nein | Wertformat: percent, currency:XXX oder affix:["before","after"] |
options.notes | nein | Anmerkungen als { "label", "text", "kind"? } pro betroffener Beschriftung. Ein Ring (ⓘ, bei warn ein !) erscheint an Balken-, Säulen-, Lollipop-, Linien-, Flächen-, Streudiagrammen, Kreisdiagrammlegende und Kennzahl. Hover oder Tippen zeigt den gesamten Text, Klicken fixiert ihn, Escape löst ihn. Der Text steht auch in der barrierefreien Datentabelle. |
options.legend | nein | Nur Matrix: lesbare Beschriftungen für die Statuswerte |
data.columns, data.cells | nur matrix | Merkmalsspalten und eine Statuszeile pro Beschriftung |
data.columns, data.rows | nur table | Typisierte Spalten (text · number · status · note) und ein Zellenarray pro Zeile |
options.sort, options.sticky | nein, nur table | Anfangssortierung { column, dir }; fixierte Kopfzeile und erste Spalte |
options.mobile | nein, nur table | Unter 480 px Containerbreite: scroll (Standard, kompakte horizontal scrollbare Tabelle mit fixierter erster Spalte) oder cards (eine Karte pro Zeile) |
options.font | nein, nur table | inherit verwendet die Schrift der Host-Seite statt der Theme-Schrift, etwa in einem Artikel. Eine Tabelle bestimmt ihre Höhe selbst, sofern die Seite keine vorgibt. |
options.height, options.search | nein, nur table | height (px, 120–4000) begrenzt lange Tabellen; Zeilen scrollen unter der fixierten Kopfzeile. search: true ergänzt ein Suchfeld, das alle angezeigten Texte einschließlich Beschriftungen, Zellen, Status und Anmerkungen gemeinsam mit Statusfiltern durchsucht. Reset setzt beides zurück. |
options.pageSize | nein, nur table | Zeilen pro Seite, 5–1000. Die Tabelle zeigt so viele Zeilen gleichzeitig, darunter Previous/Next, eine genaue Angabe wie Rows 11–20 of 63 und Show all. Statusfilter, Suche und Sortierung wirken zuerst, danach die Seiteneinteilung. Chart this column zeichnet die angezeigte Auswahl über alle Seiten hinweg. Passt alles auf eine Seite, erscheint keine Seitennavigation. |
options.table.change | nein, nur table | Zeigt Zahlenspalten als Veränderungen: [{ "column": 2, "better": "up" }]. Pfeil und Betrag werden grün bei einer günstigen und rot bei einer ungünstigen Veränderung. better ist up (Standard), down (ein Rückgang ist günstig, etwa bei Preis oder Kosten) oder none (ohne Farbe). Spaltenindizes beginnen mit 0. |
options.table.copy | nein, nur table | true ergänzt Copy und CSV für Leser. Copy kopiert die angezeigte Auswahl nach Filtern, Suche und Sortierung über alle Seiten mit Quellenangabe in die Zwischenablage, zum Einfügen in Tabellenkalkulation oder Dokument. CSV lädt sie mit unveränderten Zahlen herunter. Ohne ausdrückliche Einstellung deaktiviert. |
Eine Live-Tabelle behält negative Zahlen, zeigt und sortiert sie und zeichnet keinen Balken für eine Spalte mit negativem Wert. Alle Diagrammtypen außer number lehnen negative Werte ab: Balken und Flächen ab einer Nulllinie können sie nicht ehrlich darstellen. Ein strukturierter Fehler ist besser als eine irreführende Darstellung. Ein negativer target wird überall abgelehnt.
Sankey-Flüsse
data.links enthält Quelle, Ziel und Wert. Knoten werden aus Verbindungen abgeleitet. Optional liefert data.nodes IDs, Beschriftungen und Eingabereihenfolge. Gewichte sind positiv oder null; doppelte Verbindungen werden summiert. Zyklen und Selbstverbindungen liefern Fehler mit Zeilenpfaden.
{
"type": "sankey",
"data": {
"links": [
{
"source": "Income",
"target": "Budget",
"value": 120
},
{
"source": "Budget",
"target": "Spending",
"value": 100
}
]
}
} Die Knotenhöhe verwendet den größeren Wert aus Zu- und Abfluss. Der Tooltip nennt Unterschiede, ohne Verbindungen zu erfinden. Erlaubt sind bis zu 50 Knoten, 100 Verbindungen und acht Stufen. Fasse kleine Flüsse beim Erreichen der Grenze als „Sonstige“ zusammen.
options.flowColor: source (Standard) oder stage. options.flowOrder: minimize (Standard) oder input. options.showValues ist standardmäßig true. Namen bleiben bei verborgenen Werten sichtbar. Auf schmalen Bildschirmen scrollt das Diagramm innerhalb seines Rahmens; darunter steht eine eingeklappte Verbindungstabelle. Sankey-Maker öffnen.
Ridgeline: gruppierte Beobachtungen
Verwende data.groups mit id, label und observations pro Gruppe. Werte dürfen negativ sein; null bedeutet fehlend. Lokal sind bis zu 12 Gruppen und 2.000 Beobachtungen erlaubt. Gehostetes Rendering behält das bestehende Punktelimit des Tarifs.
{
"type": "ridgeline",
"data": {
"groups": [
{
"id": "monday",
"label": "Monday",
"observations": [
12,
15,
16,
19,
24
]
}
]
},
"options": {
"bandwidth": 2
}
} Die gaußsche Kerndichteschätzung verwendet standardmäßig eine gemeinsame Silverman-Bandbreite aus den Abweichungen innerhalb der Gruppen. Ein positives options.bandwidth überschreibt sie. Der gemeinsame X-Bereich umfasst Datenminimum und -maximum zuzüglich vier Bandbreiten je Seite. Weniger als fünf bekannte Beobachtungen oder konstante Werte werden als Punkte dargestellt. Leere Gruppen zeigen No data. null-Beobachtungen bleiben in der Tabelle und werden aus der Dichte ausgeschlossen.
Die Höhen verwenden dieselbe Dichteskala. options.ridgeScale: "own" skaliert jede Gruppe auf ihr eigenes Maximum; das Diagramm zeigt dazu einen Hinweis. options.sortByMedian: true sortiert nach Median, leere Gruppen zuletzt. Hover, Fixieren und Pfeiltasten zeigen n, Median und die mittleren 50 %. Ridgeline-Maker öffnen.
Boxplot: gruppierte Beobachtungen
Boxplot liest dieselben data.groups wie Ridgeline: id, label und observations pro Gruppe. Lokal sind bis zu 12 Gruppen und 2.000 Beobachtungen erlaubt. Gehostetes Rendering behält das bestehende Punktelimit des Tarifs. null bedeutet fehlend, niemals 0. Eine Gruppe ohne bekannte Werte bleibt sichtbar und zeigt No data.
{
"type": "boxplot",
"data": {
"groups": [
{
"id": "p1",
"label": "Period 1",
"observations": [
62,
68,
71,
74,
75
]
}
]
},
"options": {
"whiskers": "tukey"
}
} options.whiskers: tukey (Standard) reicht bis zu den äußersten Werten innerhalb des 1,5-Fachen des IQR unterhalb oder oberhalb der Box. Werte außerhalb erscheinen als Ausreißerringe. minmax reicht bis Minimum und Maximum, ohne Ausreißer. options.quartiles: linear (Standard, Excel QUARTILE.INC) oder halves (Median jeder Hälfte wie beim TI-84). Der Median ist bei beiden Verfahren gleich. options.showPoints: true zeigt jeden Wert, false verbirgt die Punkte. Ohne Angabe erscheinen Punkte, solange jede Gruppe höchstens 50 bekannte Werte hat. options.sortByMedian: true sortiert Gruppen nach Median, leere Gruppen zuletzt.
Hover, Fixieren und Pfeiltasten zeigen n, Median, die mittlere Hälfte, Whisker und Ausreißer. Die barrierefreie Tabelle enthält die Fünf-Punkte-Zusammenfassung jeder Gruppe. Boxplot-Maker öffnen.
X-Y-Streudiagramm: Punkte auf zwei Zahlenachsen
xy liest data.points: pro Zeile ein { "x", "y", "label"?, "group"? }, dazu optional die Achsentitel data.xTitle und data.yTitle mit 1–60 Zeichen. X und Y sind endliche Zahlen oder null. null bedeutet fehlend, niemals 0: Der Punkt wird nicht gezeichnet; die Quellenangabe nennt die Anzahl der Punkte ohne Daten. Beschriftungen und Gruppen haben 1–120 Zeichen. Weise entweder jedem Punkt eine Gruppe zu oder keinem. Lokal sind bis zu 2.000 Punkte und 12 Gruppen erlaubt. Gehostetes Rendering behält das bestehende Punktelimit des Tarifs.
{
"type": "xy",
"data": {
"xTitle": "Hours studied",
"yTitle": "Test score",
"points": [
{
"x": 6.5,
"y": 91,
"label": "Maya"
},
{
"x": 2,
"y": 63,
"label": "Jack"
},
{
"x": 9,
"y": 90,
"label": "Olive"
}
]
},
"options": {
"bestFit": true
}
} options.bestFit: true zeichnet für jede Gruppe mit mindestens drei Punkten und zwei unterschiedlichen X-Werten eine Trendlinie nach der Methode der kleinsten Quadrate, mit Gleichung, r und R². Bei einer Gruppe stehen sie in einer Diagrammecke. Bei mehreren Gruppen steht r jeder Linie bei genügend Platz in der Legende und immer im Tooltip der Linie. options.fromZero: true schließt 0 auf beiden Achsen ein. options.format formatiert die Y-Achse und options.xFormat die X-Achse, mit derselben Syntax (percent, currency:XXX oder affix:["before","after"]).
Hover, Fixieren und Pfeiltasten zeigen jeden Punkt und die Vorhersage der Linie für ihn. Die Linie nennt n, ihre Gleichung, r und R². Die barrierefreie Tabelle enthält jeden Punkt und bei eingeschalteter Linie Steigung, Achsenabschnitt, r und R² jeder Gruppe. Streudiagramm-Maker öffnen.
Streamgraph: Schichten eines veränderlichen Flusses
Verwende normale Zeitbeschriftungen und Datenreihen wie bei Linien- oder gestapelten Säulendiagrammen. Streamgraph erlaubt 1–6 Schichten und 2–100 Zeitpunkte. Jeder Wert muss endlich und nicht negativ sein. null ist ein Fehler; verwende für Lücken ein Liniendiagramm.
Die Silhouetten-Basislinie ist die negative Hälfte der jeweiligen Gesamtsumme. Schichten werden in Eingabereihenfolge aufgebaut. Glatte Kurven interpolieren nicht negative Schichtdicken und gemeinsame Grenzen; Werte bleiben an jedem Zeitpunkt exakt. options.curve: "linear" setzt gerade Grenzen. Es gibt keine numerische Y-Achse. Hover und Pfeiltasten zeigen exakte Werte und Anteile pro Zeitpunkt. Schichtnamen erscheinen bei genügend Platz, andernfalls in der Legende.
Legendenschalter sind deaktiviert, da verborgene Schichten irreführende Lücken erzeugen würden. Wertänderungen animieren die Bänder; der Wechsel zu Linie oder gestapelten Säulen blendet über. Streamgraph-Maker öffnen.
Bump Chart: Rangplätze im Zeitverlauf
Verwende data.labels für Zeitpunkte und eine benannte Datenreihe pro Einheit. Setze options.rankMode ausdrücklich: values berechnet Wettbewerbsränge (1, 2, 2, 4); ranks übernimmt positive ganzzahlige Positionen. Der erste Platz steht oben. Eine null-Beobachtung unterbricht die Linie.
Im Wertemodus ordnet rankDirection: "descending" größere Werte zuerst ein (Standard); ascending kleinere zuerst. showRanks ist standardmäßig false; true zeigt Rangplätze an Punkten. Optional begrenzt topN (1–12) die sichtbaren Positionen, ohne beim Verlassen oder Zurückkehren einer Einheit Ränge zu erfinden. Werte müssen endlich und nicht negativ sein. Verwende 1–12 eindeutig benannte Einheiten und 3–24 eindeutig benannte Zeitpunkte mit Namen bis 120 Zeichen. Fehler nennen das Feld und die Korrektur.
{
"type": "bump",
"data": {
"labels": [
"Jan",
"Feb",
"Mar"
],
"series": [
{
"name": "Atlas",
"values": [
40,
30,
45
]
},
{
"name": "Birch",
"values": [
35,
42,
45
]
}
]
},
"options": {
"rankMode": "values",
"rankDirection": "descending"
}
} Hover hebt eine Einheit hervor. Links und rechts bewegen sich durch Zeitpunkte, oben und unten durch Rangplätze eines Zeitpunkts. Klicken oder Enter fixiert einen Punkt; Shift ergänzt einen Vergleich. Die barrierefreie Tabelle behält jeden Zeitpunkt, Rang und Ausgangswert. PNG, SVG, Render-API und Live-Einbettungen verwenden dieselbe Szene. Bearbeite Daten im Bump-Chart-Maker. Linien zeigen Wertlücken, ein Steigungsdiagramm eignet sich für zwei Zeitpunkte.
Treemap und Sunburst: Gruppen und Elemente
Treemap und Sunburst lesen data.nodes. Gruppen haben ID und Beschriftung. Elemente nennen ihre Gruppe mit parentId und liefern einen positiven endlichen Wert oder null für fehlende Daten. Gruppensummen werden aus den Elementen berechnet. Erlaubt sind bis zu 6 Gruppen und 36 Elemente auf zwei Ebenen. IDs müssen eindeutig sein. Fehlende Eltern, Zyklen, tiefere Verschachtelung, leere Gruppen sowie Werte von 0 und negative Werte liefern einen Fehler mit Knotenpfad und Korrektur.
{
"type": "treemap",
"title": "City budget",
"data": {
"nodes": [
{
"id": "spaces",
"label": "Public spaces"
},
{
"id": "parks",
"parentId": "spaces",
"label": "Parks",
"value": 32
},
{
"id": "libraries",
"parentId": "spaces",
"label": "Libraries",
"value": 18
}
]
},
"options": {
"showValues": true,
"precision": 0,
"variant": "auto"
}
} Öffne eine Gruppe durch Klicken, Tippen oder Enter. All, Escape oder Backspace kehrt zur Gesamtansicht zurück. Dieser Ansichtszustand wird nicht in der Spezifikation gespeichert. Fehlende und unter einem Pixel große Elemente bleiben in Datentabelle und Tastatur-Tooltips erhalten. options.showValues: false verbirgt Kachelwerte; Namen bleiben bei genügend Platz sichtbar. Format, Präzision, Theme und Variante folgen denselben Regeln wie andere Diagramme. Sunburst verwendet dieselben Knoten: Ändere type auf sunburst. Der innere Ring zeigt Gruppen, der äußere Elemente, die Mitte deren Summe. Beschriftungen erscheinen nur bei genügend Platz. Treemap bearbeiten oder Sunburst erstellen.
Die 27 Typen
| Typ | Verwendete Daten | Live-Beispiele |
|---|---|---|
sankey | Gerichtete Verbindungen: Quelle, Ziel, positiver Wert oder `null`; 50 Knoten, 100 Verbindungen, 8 Stufen | Live ansehen |
ridgeline | 1–12 Gruppen roher Beobachtungen, insgesamt 2.000 Messwerte | Live ansehen |
boxplot | 1–12 Gruppen roher Beobachtungen; Median, Quartile und Ausreißer | Live ansehen |
streamgraph | 1–6 Schichten, 2–100 Zeitpunkte, nicht negative Werte ohne Lücken | Live ansehen |
column | Beschriftungen und mindestens eine Datenreihe | Live ansehen |
bar | Beschriftungen und mindestens eine Datenreihe, horizontal | Live ansehen |
line | Beschriftungen und mindestens eine Datenreihe | Live ansehen |
area | Beschriftungen und mindestens eine Datenreihe, bis zur Nulllinie gefüllt | Live ansehen |
stacked | Beschriftungen und mindestens eine Datenreihe, je Beschriftung summiert | Live ansehen |
donut | Beschriftungen und ausschließlich die ERSTE Datenreihe | Live ansehen |
scatter | Beschriftungen und mindestens eine Datenreihe, ein Punkt pro Wert (Punkte im Diagramm-Maker) | Live ansehen |
xy | Punkte mit x und y sowie optional Beschriftung und Gruppe auf zwei Zahlenachsen; bis zu 2.000 Punkte und 12 Gruppen; options.bestFit ergänzt die Trendlinie | Live ansehen |
dotplot | Beschriftungen und Anzahlen, jeweils ein gezeichneter Punkt; Bruchteile werden abgerundet | Live ansehen |
number | Erster Wert der ersten Datenreihe, mit Vorzeichen | Live ansehen |
lollipop | Beschriftungen und 1–3 Datenreihen: Stiele und Punkte; bei 2–3 Reihen nur Punkte (Cleveland-Diagramm) | Live ansehen |
dumbbell | Beschriftungen und genau 2 Datenreihen: zwei verbundene Punkte pro Zeile mit beschrifteter Veränderung | Live ansehen |
range | Beschriftungen und genau 2 Datenreihen (Unter- und Obergrenze, Obergrenze ≥ Untergrenze), ein Band pro Zeile | Live ansehen |
waterfall | Beschriftungen und 1 Datenreihe mit Schritten ≥ 0; schwebende Säulen ab laufender Summe, Abschluss durch options.total | Live ansehen |
bullet | Beschriftungen und Istwerte, optional Ziele pro Zeile als zweite Reihe, über options.bands | Live ansehen |
slope | Genau 2 Beschriftungen (damals, heute) und mindestens eine Datenreihe; gerade Linie pro Reihe, an beiden Enden benannt | Live ansehen |
heatmap | Beschriftungen als Spalten, Datenreihen als Zeilen, jede Zelle nach Wert gefärbt; options.scale fixiert den Bereich | Live ansehen |
waffle | Beschriftungen und ausschließlich die ERSTE Datenreihe; Anteile als options.units Quadrate (Standard: 100) | Live ansehen |
matrix | Beschriftungen als Zeilen, Spalten und Zellen mit yes | no | partial | unknown | na | Live ansehen |
sunburst | Dieselben zweistufigen Knoten wie bei Treemap, als Ringe dargestellt | Live ansehen |
bump | 3–24 Zeitpunkte, 1–12 benannte Einheiten; ausdrücklicher Werte- oder Rangmodus | Live ansehen |
treemap | Zwei Knotenebenen: Gruppen und Elemente mit positivem Wert oder `null` | Live ansehen |
table | Typisierte Spalten und Zeilen aus Text, Zahlen, Status und Anmerkungen; als Live-DOM-Tabelle statt Canvas gerendert | Live ansehen |
Eine Änderung von type an einem geladenen Diagramm zeichnet es nicht neu. Die Engine animiert die vorhandenen Formen in die neuen. Das ist der Kern dieses Projekts.
Bei column mit einer Datenreihe zeichnet options.histogram: true rechteckige Klassen in einer Palettenfarbe, mit 1 px Abstand aneinander anschließend. Ohne diese Option entstehen normale Säulen.
{ "type": "column", "options": { "histogram": true },
"data": { "labels": ["0–10", "10–20", "20–30"], "series": [{ "values": [9, 27, 38] }] } } Themes und Varianten
Fünf Themes mit jeweils heller und dunkler Variante ergeben zehn Gestaltungen. options.variant wählt eine aus: light und dark legen sie fest; auto folgt zuerst der Host-Seite über ein Attribut data-theme, eine Klasse dark an html oder body oder deren color-scheme, danach dem Betriebssystem. Änderungen werden live übernommen. Ohne das Feld gilt keine dieser Regeln: Jedes Theme zeigt seine eigene Grundvariante (editorial, glass und mint hell, ink und neon dunkel). Eine Seite mit eigener Theme-Auswahl kann weiterhin ausdrücklich light oder dark übergeben.
Anmerkungen
Ehrlichkeit als Funktion: options.notes bindet eine Einschränkung an eine Beschriftung, etwa Stichtag, bekannte Teilsumme oder ungeprüfte Behauptung. An betroffenen Beschriftungen erscheint bei Balken, Säulen, Lollipop, Linie, Fläche, Kreis, Streuung und Kennzahl ein kleiner Ring mit i, bei warn mit !. Eine Anmerkung mit partial behält die Warnfarbe. Die Matrix markiert Zellen der Zeile mit einem Eckpunkt. Hover oder Tippen zeigt den ganzen Text, Klicken hält ihn offen. Der Text steht auch in der verborgenen barrierefreien Tabelle. So bleibt die Einschränkung beim Diagramm statt in einer Fußnote.
"options": {
"notes": [
{ "label": "Vanilla", "text": "Updates stop from 1 January 2025", "kind": "warn" },
{ "label": "Circle", "text": "Known part only; processing is extra", "kind": "partial" }
]
} Die Statusmatrix
matrix liest Zellen statt Datenreihen. Zeilen kommen aus data.labels, Merkmale aus data.columns. Jede Zelle enthält einen Status aus yes | no | partial | unknown | na, als Zeichenfolge oder { "status", "note" } für eine zellbezogene Anmerkung. Status erscheinen als Formen (Haken, Kreuz, Halbkreis, Fragezeichen, Strich), niemals nur als Farbe. options.legend benennt sie für Legende, Tooltip und barrierefreie Tabelle um. Unbekannt und nicht zutreffend sind bewusst getrennt: Eine fehlende Tatsache wird nicht zu Nein.
{
"type": "matrix",
"data": {
"labels": ["Discourse", "Flarum"],
"columns": ["Licence fee", "Server", "Updates"],
"cells": [
["yes", "no", "yes"],
["yes", "no", { "status": "partial", "note": "Community builds only" }]
]
},
"options": { "legend": { "yes": "None to pay / included", "no": "On the team / paid" } }
} Die Live-Tabelle
table ist der einzige Typ, der kein Bild ist: <live-chart> erzeugt eine echte HTML-Tabelle. Eine zweite kleine Datei wird nur auf Seiten mit Tabelle geladen. Spalten haben einen Typ: text, number mit dem üblichen format, status (Matrixwerte als Chip mit Form und optionaler Beschriftung) oder note. Jede Zelle ist eine Zeichenfolge, Zahl, null, { "status", "label", "note" } oder { "text", "kind", "note" }; note ist optional. Die Tabelle sortiert beim Klick auf Überschriften, filtert mit Statuschips, zeichnet kleine Balken hinter Zahlen, erweitert Anmerkungen beim Klick und scrollt unter 480 px Breite horizontal. options.mobile: "cards" verwendet stattdessen Karten. Die Schaltfläche Chart übergibt eine numerische Spalte oder eine Statusspalte mit numerischen Chips als Lollipop an die Engine. SVG-Export gibt es nicht; eine strukturierte Ablehnung erklärt dies. PNG wird über das lokale MCP mit Pro gerendert.
{
"type": "table",
"title": "What you are buying",
"data": {
"columns": [
{ "name": "Product" },
{ "name": "Licence cost", "kind": "status" },
{ "name": "Monthly", "kind": "number", "format": "currency:USD" },
{ "name": "What still lands on the team", "kind": "note" }
],
"rows": [
["Discourse", { "status": "yes", "label": "None" }, 100, "Server and an SMTP mail service"],
["Vanilla", "yes", null, { "text": "Updates stop from 1 January 2025", "kind": "warn" }]
]
},
"options": { "sort": { "column": 2, "dir": "desc" }, "sticky": true }
} In einer Text- oder Anmerkungsspalte hält { "text": "Limited claim", "kind": "warn", "note": "Full explanation" } die Aussage sichtbar und öffnet die Erklärung mit der Schaltfläche !. kind ist note, warn oder partial. Die Erklärung ist Klartext bis 4000 Unicode-Zeichen; noteText und detail liefern Validierungsfehler. Ohne note bleibt Text sichtbar und das Symbol erklärt seine Bedeutung. Bestehende Statuszellen mit + und Anmerkung funktionieren weiterhin. Füge das vollständige Tabellen-JSON im Tabellen-Maker ein, um typisierte Zellen und Layout zu erhalten. Download JSON speichert sie ohne Größenlimit des Links zum Teilen.
Ziellinien
Ziel, Grenze oder SLA: options.target zeichnet bei Säulen-, Balken-, Linien-, Flächen-, gestapelten, Streu- und Punktdiagrammen eine gestrichelte Linie am Wert, optional mit Beschriftung. Die Skala wird stets so erweitert, dass sie enthalten ist.
"options": {
"target": { "value": 120, "label": "Goal" }
} Linien und Anteile
options.curve legt die Form zwischen Punkten einer Linie oder Fläche fest: smooth (Standard), linear für gerade Abschnitte, step für Stufen. Jeder Wert bildet ein Plateau um seine Beschriftung, der Anstieg liegt zwischen Beschriftungen (Stufendiagramme ansehen). slope verwendet genau zwei Beschriftungen als Zustände und benennt jede Reihe an beiden Enden mit exaktem Wert. null auf einer Seite unterbricht diese Linie und zeigt —. heatmap verwendet die übliche Datenstruktur mit Beschriftungen als Spalten und Reihen als Zeilen. Zellen werden vom Theme-Hintergrund zur ersten Palettenfarbe gefärbt. options.scale mit { "min", "max" } fixiert den Bereich und begrenzt Werte außerhalb. null-Zellen bleiben flach und unbeschriftet. waffle verteilt die erste Reihe nach größten Resten auf options.units Quadrate (1–400, Standard 100), sodass deren Summe immer stimmt. Die Legende entspricht dem Kreisdiagramm; Hover auf einem Quadrat hebt den gesamten Anteil hervor.
{ "type": "line", "options": { "curve": "step" } }
{ "type": "slope", "data": { "labels": ["2024", "2025"], "series": [{ "name": "Search", "values": [31, 44] }] } }
{ "type": "heatmap", "options": { "scale": { "min": 0, "max": 50 } },
"data": { "labels": ["Mon", "Tue"], "series": [{ "name": "North", "values": [12, 30] }, { "name": "South", "values": [8, null] }] } }
{ "type": "waffle", "options": { "units": 100 }, "data": { "labels": ["Yes", "No"], "series": [{ "values": [73, 27] }] } } Zahlenformate
options.format wirkt zugleich auf Achsenwerte, Wertbeschriftungen, gestapelte Summen, Kennzahl und Tooltips. percent ergänzt das Prozentzeichen; currency:XXX setzt $, € oder £ vor USD, EUR und GBP. Andere Währungen verwenden den Code selbst, etwa CAD 1,234.5. Eigene Einheiten verwenden affix:["before","after"]: affix:[""," lb"] ergibt 1,234.5 lb, affix:["~",""] ergibt ~1,234.5. Je Seite sind bis zu 12 Zeichen einschließlich Leerzeichen erlaubt. Werte werden nie umgerechnet. Lesbare Zahlen sind exakt: Wertbeschriftungen, Tooltips, Kennzahl und Tabellenzellen behalten die Dezimalstellen der Daten (99.98% bleibt 99.98%, $201.5 wird $201.50), gruppieren Tausender (12,345) und kürzen nie. Nur Achsenwerte bleiben kompakt ($48k). options.precision (0–4) legt Dezimalstellen ausdrücklich fest. Zwei bewusste Ausnahmen bleiben schlicht: der Anteil eines Kreisdiagrammsegments, der bereits Prozent ist, und die Anzahlen eines Punktdiagramms, die weder Geld noch Anteile sind.
"options": { "format": "percent" } // 99.98 -> 99.98% on the bar, 100% on the axis
"options": { "format": "currency:USD" } // 48200 -> $48,200 on the bar, $48k on the axis
"options": { "precision": 2 } // 5 -> 5.00 everywhere a reader reads it Strukturierte Fehler
Der Parser löst nie eine Ausnahme aus und rät nie. Eine fehlerhafte Spezifikation liefert eine Liste von {path, message, hint}-Objekten mit dem genauen Feld. Dieselbe Struktur gilt im Browser, über MCP und in der Render-API und ist für Menschen wie Assistenten lesbar.
{
"ok": false,
"errors": [{
"path": "data.series[0].values[2]",
"message": "Value \"abc\" is not a finite number",
"hint": "Use numeric values, e.g. 42 or 3.14"
}]
}