MatPlotLibNet

official

Hand it the JSON for a chart and it renders a PNG the model can actually look at — 83 chart types, SVG and PDF written to file, running locally as a .NET tool.

What can you do with MatPlotLibNet MCP?

  • Render charts from JSON specs — Ask for a chart via render_chart and get a PNG plus a text summary of what was drawn.
  • Save charts to files — Use save_chart to export a chart as PNG, SVG, or PDF and receive the written file path.
  • Discover chart capabilities — Query list_chart_types to see all 83 supported series types, from line plots to 3D surfaces.
  • Validate chart schemas — Get field-level error feedback from describe_chart_schema when a chart specification is malformed.

Documentation

MatPlotLibNet

A .NET 10 / .NET 8 charting library inspired by matplotlib: fluent API, DI-friendly, server-side SVG / PNG / PDF / animated-GIF export, an MCP server so an AI agent can draw with it, and 83 series types. Ships with 13 map projections and embedded Natural Earth data, 30 themes, LaTeX-style MathText, O(1) streaming with 53 technical indicators, a control room (Plt.OpsDashboard() — KPI tiles, state timelines, one shared trend window), and native controls for Blazor, WPF, MAUI, Avalonia, Uno and ASP.NET Core, plus TypeScript clients for Angular, React and Vue. No JavaScript framework, no WebView, no SaaS.

CI NuGet NuGet Downloads License: MIT GitHub stars

Where this is going

The 1.15 line opens the library to agents: MatPlotLibNet.Mcp is a Model Context Protocol server, so a model can render any of these chart types from a JSON spec and look at the result — and is told which field is wrong when the spec is not one.

The 1.14 line before it was control-room work: Plt.OpsDashboard() and the tile anatomy arrived with it, and the releases since are the fixes and extensions a live operator wall asked for — a secondary Y axis that is a full citizen, streaming that draws in SVG, 3-D axis titles that clear their own labels, tile captions that wrap and stay inside their tile, and an ops window whose ticks read as time.

After that the cadence is community-driven: bug fixes, documentation, and whatever real use turns up. Open a Discussion or an Issue — that is what steers the next release. Every release, with its migration notes, is in the CHANGELOG.

Quality bar: a strict per-class coverage gate at ≥90 % line and branch (679 classes, 99.6 % / 97.3 %) across 11,022 tests, with rendering verified against matplotlib pixel-fidelity fixtures.


Documentation


Packages

PackageInstallWhat it does
MatPlotLibNetdotnet add package MatPlotLibNetCore: models, fluent API, SVG rendering, JSON, transforms
MatPlotLibNet.DataFramedotnet add package MatPlotLibNet.DataFrameMicrosoft.Data.Analysis.DataFrame extension methods — plot, indicators (SMA/EMA/RSI/MACD/…), and polynomial regression from named columns
MatPlotLibNet.Skiadotnet add package MatPlotLibNet.SkiaPNG, PDF, and animated GIF export via SkiaSharp
MatPlotLibNet.Blazordotnet add package MatPlotLibNet.BlazorMplChart + MplLiveChart Razor components with SignalR
MatPlotLibNet.AspNetCoredotnet add package MatPlotLibNet.AspNetCoreREST endpoints, SignalR hub, IChartPublisher
MatPlotLibNet.Interactivedotnet add package MatPlotLibNet.Interactivefigure.ShowAsync() — browser popup, no server needed
MatPlotLibNet.GraphQLdotnet add package MatPlotLibNet.GraphQLGraphQL queries + subscriptions via HotChocolate
MatPlotLibNet.Mauidotnet add package MatPlotLibNet.MauiNative MplChartView via Microsoft.Maui.Graphics
MatPlotLibNet.Avaloniadotnet add package MatPlotLibNet.AvaloniaNative MplChartControl for Avalonia 12 — Skia backend, optional local interaction
MatPlotLibNet.Unodotnet add package MatPlotLibNet.UnoNative MplChartElement for Uno Platform (WinUI 3 / Android / iOS / macCatalyst)
MatPlotLibNet.Wpfdotnet add package MatPlotLibNet.WpfNative WPF MplChartControl via SkiaSharp — all 9 interaction modifiers
MatPlotLibNet.Geodotnet add package MatPlotLibNet.Geo13 map projections, GeoJSON parser, Natural Earth 110m data, geographic polygons
MatPlotLibNet.Notebooks#r "nuget: MatPlotLibNet.Notebooks"Inline SVG in Polyglot / Jupyter notebooks
MatPlotLibNet.Mcpdnx MatPlotLibNet.McpMCP server — an AI agent renders charts over stdio (cookbook)
@matplotlibnet/angularnpm install @matplotlibnet/angularAngular components + TypeScript SignalR client
@matplotlibnet/reactnpm install @matplotlibnet/reactReact hooks + components + TypeScript SignalR client
@matplotlibnet/vuenpm install @matplotlibnet/vueVue 3 composables + TypeScript SignalR client

Quick start

using MatPlotLibNet;
using MatPlotLibNet.Styling;

double[] x = [1, 2, 3, 4, 5];
double[] y = [2, 4, 3, 5, 1];

Plt.Create()
    .WithTitle("My First Chart")
    .WithTheme(Theme.Dark)
    .Plot(x, y, s => { s.Color = Color.Blue; s.Label = "Data"; })
    .WithLegend()
    .Save("chart.svg");

Features

83 series types — line, scatter, bar, histogram, pie, box, violin, heatmap, contour, candlestick, OHLC, treemap, sunburst, Sankey, polar, polar heatmap, 3D surface, Bar3D, PlanarBar3D, Line3D, Trisurf3D, Contour3D, Quiver3D, Voxels, Text3D, radar, waterfall, funnel, gauge, stat tile (single-value KPI), state timeline (discrete state segments over time), pair grid, relative rotation graph, streaming line/scatter/signal/candlestick, and more.

MCP server — charts for an AI agentMatPlotLibNet.Mcp is a Model Context Protocol server, shipped as a .NET tool a host starts over stdio. Four tools: render_chart (PNG plus a text summary of what was drawn), save_chart (PNG/SVG/PDF to a file, returning the path it wrote), list_chart_types and describe_chart_schema. The spec is the library's own figure JSON, so anything the library draws, an agent can ask for — and the server refuses a wrong spec by field name before it renders, instead of returning a blank picture. See the cookbook.

{ "servers": { "MatPlotLibNet.Mcp": { "type": "stdio", "command": "dnx", "args": ["MatPlotLibNet.Mcp", "--yes"] } } }

Control roomPlt.OpsDashboard() composes one operator screen: KPI tiles across the top, state timelines under them, and a shared trend panel, all pinned to one caller-supplied time window (the library never reads the wall clock). The tile carries a Target, a wrapping multi-line Caption, an inline sparkline and a Hatch that means no information; Theme.Alarm names the reserved alarm colours and four operator backgrounds ship with it. BulletGraphSeries replaces the radial gauge.

Native UI controlsMplChartControl for Avalonia 12 and MplChartElement for Uno Platform render charts natively via SkiaSharp — no browser, no WebView, no SignalR required. 9 interaction modifiers: pan (drag), zoom (scroll), 3D rotation (right-drag), rectangle zoom (Ctrl+drag), brush select (Shift+drag), span select (Alt+drag), legend toggle (click), crosshair (passive), hover tooltip. Toolbar state model, view history (back/forward), data cursor (click-to-pin), tick mirroring, tight margins.

MathText — LaTeX-like inline math in any label or title: $\alpha^{2}$, $\frac{a}{b}$, $\sqrt{x}$, $\hat{x}$, $\mathbf{F}$, $\mathbb{R}$. 96 symbol mappings (Greek, math operators, arrows, relations, set/logic, blackboard bold), fractions, square roots, accents, font variants, spacing, and scaling delimiters.

3-D charts — 12 series types: Surface, Scatter3D, Bar3D, PlanarBar3D, Line3D, Trisurf3D (Delaunay), Contour3D (marching squares), Quiver3D (vector field), Voxels (face-culled cubes), Text3D (annotations). Full Projection3D pipeline, DepthQueue3D painter's algorithm, Vec3.FaceNormal + Color.Shade()/Color.Modulate() extension-based shading, Svg3DRotationScript client-side rotation with depth re-sorting, camera-derived back faces (CubeFaceSelection — the panes, cube edges, wall grids and tick rows follow the camera at any azimuth, server-side and during a drag), configurable Pane3DConfig (floor/wall colors), and 3D colorbar support.

Streaming & RealtimeStreamingLineSeries, StreamingScatterSeries, StreamingSignalSeries, StreamingCandlestickSeries backed by DoubleRingBuffer with AppendPoint(x, y). StreamingFigure provides throttled re-rendering and auto-scaling axes (SlidingWindow, StickyRight, AutoScale). 11 streaming indicators (SMA, EMA, RSI, Bollinger, MACD, OBV, ATR, Stochastic, WilliamsR, CCI, VWAP) auto-attach to candlestick data. Streaming controls for Avalonia, Uno, MAUI, Blazor, and ASP.NET Core. SVG diff engine for bandwidth optimization. Rx IObservable<T> adapter.

Geographic projectionsMatPlotLibNet.Geo package with 5 map projections (PlateCarree, Mercator, Robinson, Orthographic, LambertConformal), GeoJSON parser, Natural Earth 110m embedded data, and GeoPolygonSeries for coastlines/borders/choropleth. Symlog axis scale for data spanning positive and negative ranges.

Bidirectional SignalR — server-authoritative interactive charts with mutation events (zoom, pan, reset, legend toggle) and notification events (brush-select, hover). Stacked-record event hierarchy, natural coalescing, per-caller hover responses.

142 colormaps — viridis, plasma, turbo, coolwarm, and 138 more (71 base maps, each with an auto-registered reversed _r variant). NumPy-style SIMD numerics (Vec, Mat, Linalg, Fft). Accessibility (ARIA, keyboard, Okabe-Ito palette, high-contrast theme). Matplotlib look-alike themes. DataFrame integration with 53 technical indicators. Broken axes. Publication-quality SVG/PNG/PDF/GIF export.


License

MIT — free for any use, open-source or commercial, with no copyleft conditions.