ggpbi — Grammar of Graphics für Power BI
Eigenes Open-Source-Projekt · TypeScript & D3 · MIT-Lizenz · github.com/efelcie/ggpbi · Stand
Power BI kennt eine feste Liste von Diagrammtypen. Wer etwas anderes braucht, greift zu R- oder Python-Visuals — die brauchen eine installierte Laufzeit und liefern am Ende ein Bild: kein Cross-Filtering, keine nativen Tooltips.
ggpbi geht den anderen Weg. Es bringt die Grammatik von ggplot2 nach Power BI — Felder werden Aesthetics zugeordnet, Geome als Ebenen gestapelt — aber als natives TypeScript/D3-Visual. Keine Laufzeit, kein R, kein Python. Es rendert so schnell wie ein eingebautes Visual und läuft im Power BI Service.
Gebaut wird so ein Bericht, indem man Felder in die Wells zieht; die Format Pane schreibt daraus die ggpbi-Kette. Und umgekehrt: seit Version 0.5 ist die Code-Ansicht ein echter Editor, auf Wunsch mit vim-Modus. Was man dort ändert, schreibt sich in den Pane zurück — Editor und Pane sind zwei Türen in denselben Raum. Der Editor spricht drei Sprachen: die ggpbi-Kette, ggplot2 in R, und ggpbir, das JSON-Format des Berichts.
Und außerhalb von Power BI
ggpbi ist am Ende ein ES-Modul mit D3 darunter — Power BI ist einer der Orte, an denen es läuft, nicht der einzige. Beide Diagramme auf dieser Seite sind damit gezeichnet: die Stunden oben bei den Kenntnissen und die Bücher-Matrix. Und zwar wirklich damit — der Code darunter ist genau der, der sie zeichnet, kein vereinfachtes Beispiel. Geladen wird die Bibliothek erst, wenn die Seite steht; bis dahin steht ein SVG da, und es bleibt stehen, falls etwas nicht klappt.
ggpbi() // die Stunden
.data(stunden) // 2 x lernen + üben
.aes({ x: 'Jahr', y: 'Gewichtet',
color: 'Skills' })
.geom('hline', { yintercept: 10000,
linetype: 'dashed' })
.geom('line', { size: 2 })
.size(640, 400)
.renderTo(element);
ggpbi() // die Bücher
.data(buecher)
.aes({ x: 'Umfang', y: 'Wirkung',
color: 'Genre', label: 'Titelkurz' })
.scale({ x: { labels: () => '' },
y: { labels: () => '' } })
.geom('point', { size: 4, alpha: 0.72 })
.tooltip({ fields: ['Titel','Autor','Gelesen'] })
.geom('text', { repel: true, size: 10 })
.geom('vline', { xintercept: mitte })
.renderTo(element);
repel schiebt sie
auseinander, bis keines mehr das andere verdeckt.
Was drin ist
Geome: point, line, bar, col, area, text, boxplot, violin, histogram, density, smooth (lm, loess, gleitender Mittelwert), segment, pointrange, dazu die Referenzlinien hline, vline und abline.
Grammatik: Aesthetics (x, y, color, fill, size, shape, alpha, group, label), Positionen (identity, stack, dodge, fill, jitter), Skalen (linear, log, sqrt, Zeit, Kategorie) mit Zahlen- und Datumsformaten nach Gebietsschema, Facetten nach Zeile und Spalte, Hervorhebung im Stil von gghighlight.
Power BI nativ: Cross-Filtering per Klick, native Tooltips, Kontextmenü, Report-Themes, Hochkontrast-Modus und Stil-Vorlagen.
Zwei Felder genügen für den Anfang: eines nach X, eines nach Y. ggpbi wählt das Geom nach den Skalentypen — Zahl und Zahl geben einen Streuplot, Kategorie und Zahl ein Balkendiagramm, Datum und Zahl eine Linie, eine Zahl allein ein Histogramm.
Stand: Version 0.5.0 — rund 16.000 Zeilen TypeScript in 51 Modulen, 67 Testdateien. Noch nicht auf AppSource, die Installation läuft über den Dateiimport in Power BI Desktop.
Denselben Kern — Skalen, Achsen, Label-Engine — habe ich nach Elm portiert, um zu sehen, was von der Grammatik uebrig bleibt, wenn der Compiler jede Luecke anmerkt. Die Charts auf dieser Seite sind die TypeScript-Fassung.