Sixteen matching report themes for Power BI, Excel, matplotlib, plotly, Vega-Lite, and CSS. Pick a look, download one file per tool, and every chart, dashboard, and slide you ship shares the same colors and type.
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
Six of the sixteen themes, each doing its day job: a board-pack cost bridge, a progress S-curve, an analyst's scatter, a technical heatmap, a balance readout, and one control-room feed for the dark-mode crowd. Every panel is matplotlib loading the shipped .mplstyle, and every color is one of the theme's named roles.
Made for analysts, engineers, and project people who ship reports every week and would rather not design them from scratch.
Power BI. View ribbon, Themes dropdown, Browse for themes, pick themes/powerbi/<name>.json. Data colors, text classes, axis and gridline styling land in one step.
Excel, PowerPoint, Word. Page Layout (Design in PowerPoint and Word), Themes, Browse for Themes, pick themes/excel/<name>.thmx. Theme colors, accent cycle, and heading/body fonts apply to the whole document. The raw themes/excel/<name>-theme.xml is also here if you prefer to swap xl/theme/theme1.xml inside a workbook directly.
matplotlib.
import matplotlib.pyplot as plt
plt.style.use("themes/matplotlib/agraw.mplstyle")plotly.
import json
import plotly.graph_objects as go
import plotly.io as pio
with open("themes/plotly/agraw.json") as f:
pio.templates["agraw"] = go.layout.Template(json.load(f))
pio.templates.default = "agraw"Vega-Lite. The file is a config object. Embed it in a spec ("config": {...}) or pass it to vega-embed:
vegaEmbed(el, spec, { config: await (await fetch("themes/vega-lite/agraw.json")).json() });CSS. themes/css/<name>.css defines --theme-* custom properties: every palette role, the categorical cycle as --theme-series-1..n, and both font stacks.
Each strip shows the categorical cycle first, then the neutrals (background, ink, body text, hairlines, gridlines).
![]() |
![]() |
![]() |
Three more, same rule: NOROSHI flags two KPIs behind target, ABRID slopes rail past road, EVIDENTIA proves the cycle-time cut site by site.
Every color is a named role: primary, muted, benchmark, positive, negative, plus each theme's own accents. The categorical cycle keeps one order everywhere, so series 1 is the same color in Power BI, matplotlib, and plotly. A few austere themes (LEX, SAGA, LOGOS) reuse a color across roles on purpose; their cycles are shorter and their Office accent slots fill from the neutrals.
Each theme names a display font and a body font with installed fallbacks (Georgia, Arial, and friends). Office and Power BI fall back cleanly when the first-choice font is not installed.
Everything under themes/ and assets/strips/ is generated. Never edit those files by hand.
python generate.py # rebuild all formats from tokens/
python generate.py --check # CI gate: fails if outputs drift from tokens
python tools/verify.py # parses every file with its real consumer
python tools/hero.py # re-render the README hero images
Built on the Open Visualization Protocol: the sixteen themes are its sixteen design languages, and every color here is a role from its v1.0 token files (see tokens/SOURCE.md for the pin). Nothing in this repo invents a color; the generator only translates roles into each tool's format. If you want the full system behind the themes (74 chart specs, deterministic renderers, decision rules for which chart to use), start there.
MIT licensed.








