MatPlotLibNet
oficialPásale el JSON de un gráfico y renderiza un PNG que el modelo realmente puede ver: 83 tipos de gráficos, SVG y PDF escritos en archivo, ejecutándose localmente como una herramienta .NET.
¿Qué puedes hacer con MatPlotLibNet MCP?
- Renderizar un gráfico a partir de una especificación — Pide al agente que renderice una figura a partir del JSON de figura de la biblioteca y obtén un PNG junto con un resumen de texto de lo que se dibujó (
render_chart). - Guardar gráficos en disco — Haz que el agente escriba un gráfico como PNG, SVG o PDF en un archivo y devuelva la ruta donde lo escribió (
save_chart). - Obtener los números subyacentes — Solicita los datos a partir de los cuales se dibuja una imagen como una tabla markdown, algo que una imagen por sí sola no puede proporcionar (
chart_data_table). - Descubrir tipos de gráficos y esquemas — Pregunta qué tipos de gráficos existen y qué campos necesita una especificación antes de renderizar (
list_chart_types,describe_chart_schema). - Usar gráficos estadísticos de una sola llamada — Solicita un Pareto, ridgeline, gráfico QQ, gráfico de control, curva de Kaplan-Meier, stream graph o Marimekko construido a partir de tus datos en una sola llamada.
Documentación
MatPlotLibNet — matplotlib para .NET
MatPlotLibNet es una biblioteca de gráficos para C#, .NET 10 y .NET 8, inspirada en matplotlib. Dibuja 83 tipos de gráficos y los guarda como SVG, PNG, PDF o un GIF animado, directamente desde el código de tu servidor. No necesita un framework de JavaScript, un WebView ni un servicio alojado.
Tiene una API fluida y funciona con inyección de dependencias. Incluye 148 mapas de color, 30 temas, 13 proyecciones
de mapas con datos Natural Earth integrados, MathText al estilo LaTeX, texto en cualquier escritura, streaming O(1) con 58
indicadores técnicos, una sala de control (Plt.OpsDashboard() — mosaicos de KPI, líneas de tiempo de estado, una ventana de tendencia compartida),
y un servidor MCP para que un agente de IA pueda dibujar con ella. Los gráficos se renderizan de forma nativa en Blazor, WPF, MAUI, Avalonia, Uno y
ASP.NET Core, dentro de una celda de notebook de Verso, y hay clientes TypeScript para Angular, React y Vue.
Hacia dónde va esto
1.22.0 permite que varias series compartan un mismo color en lugar de que cada una tome el siguiente del ciclo del tema, y
lo dedica a tres cosas: una curva de Kaplan-Meier ahora dibuja su banda de confianza y sus marcas de censura en el color
propio de la curva, y dos nuevos verbos, Raincloud (un medio violín, una caja estrecha y los puntos brutos de un grupo en un solo color) y
Horizon (una serie con signo plegada en bandas de dos matices), llevan el constructor de ejes a diecisiete verbos.
1.21.0 hace que cada tipo de gráfico y cada ajuste de ejes se serialice y deserialice por JSON de forma completa. Los nodos y
enlaces de un Sankey, los árboles de un treemap, sunburst, dendrograma y clustermap, las filas de una cuadrícula de árbol, los datos de un gráfico polar, los
puntos actuales de un gráfico de streaming y los datos de un gráfico de barras 3D planar vuelven ahora desde JSON como ellos mismos, no como un
marcador de posición — el servidor MCP los lista y acepta los ocho
de nuevo, donde antes los rechazaba por su nombre. El eje Z de unos ejes, los colores de su panel 3D y su interruptor de tooltip también vuelven.
La única serie que esta versión no alcanzó es el GeoPolygonSeries de MatPlotLibNet.Geo, indicado en la
hoja de ruta.
1.20.0 convierte gráficos que ocupaban una página de código en una sola llamada. Quince verbos en el constructor de ejes, entre ellos
Pareto, Ridgeline, CalendarHeatmap, QQPlot, ControlChart, KaplanMeier, StreamGraph y Marimekko, toman
los datos tal como los tienes (nombres, grupos, muestras, fechas) y construyen el gráfico a partir de las series que la biblioteca ya tiene.
Debajo de ellos, una figura escrita en JSON ahora se lee de vuelta como la imagen que era, con cada ajuste que dibuja, de modo que el
servidor MCP y cada transporte la llevan completa. NaN es el único valor faltante: una línea se rompe en un hueco, como en
matplotlib, y no se dibuja nada en NaN. Las barras en un eje logarítmico llegan al borde inferior, las barras horizontales funcionan, los nombres de categoría
son etiquetas de marca con espacio para el título del eje, y WithDpi y SaveOptions ahora llegan al archivo. Cada nueva llamada
se muestra en código en la página de ejemplos de la wiki.
1.19.0 es para gráficos con más de una línea y más de un eje. WithDirectLabel() escribe el nombre de una línea en
su extremo, en el color propio de la línea, en lugar de en la leyenda, y SetYAxisColor / SetXAxisColor colorean un eje para
que coincida con su línea en una sola llamada, tanto en el eje izquierdo, inferior, derecho como superior. Los ejes derecho y superior ahora siguen sus
propios ajustes de marcas, obtienen espacio propio en el diseño y conservan sus colores a través de JSON, y una línea en ellos se oculta
cuando se hace clic en su entrada de leyenda. En un gráfico interactivo del servidor y en los controles WPF, Avalonia y Uno, el hover,
la selección, el zoom, el desplazamiento y el cursor de datos informan los valores que ve el lector, también en ejes logarítmicos, y un límite de eje que
establezcas, invertido o no, es ahora exactamente el rango dibujado. Cada nueva llamada
se muestra en código en la página de ejemplos de la wiki, y cada ejemplo de C#
de la wiki ahora compila.
Después de eso, las versiones siguen lo que necesita la comunidad: correcciones de errores, documentación y lo que surja en el uso real. Abre una Discussion o un Issue; eso es lo que decide la próxima versión. Cada versión, con sus notas de migración, aparece en el CHANGELOG, y la hoja de ruta dice qué está hecho, qué está por venir y qué se deja fuera a propósito, con una sección para cada fila en la página de la wiki.
Nivel de calidad: cada clase debe pasar una puerta de cobertura estricta de ≥90 % de cobertura de líneas y ramas (817 clases, con
99,7 % de líneas / 98,6 % de ramas) en 19.890 pruebas. Una suite aparte (Tst/MatPlotLibNet.Fidelity) compara el
renderizado con imágenes de referencia dibujadas por matplotlib; no forma parte de la ejecución de CI.
Documentación
- Wiki — primeros pasos, cheatsheet, los 83 tipos de gráficos, la sala de control, estilos, streaming, SignalR, paquetes
- De matplotlib a C# — la llamada de pyplot que conoces, y la línea que la dibuja aquí
- Cookbook — ejemplos para copiar y pegar con salida renderizada
- Playground — prueba gráficos en vivo en el navegador
- Referencia de API — generada a partir de los documentos XML
- Hoja de ruta — qué está hecho y qué está por venir, en el orden en que cada fila necesita la de arriba; la página de la wiki dice qué requiere cada fila y qué se deja fuera a propósito
- Benchmarks · Política de cobertura · CHANGELOG
Paquetes
| Paquete | Instalación | Qué hace |
|---|---|---|
| MatPlotLibNet | dotnet add package MatPlotLibNet | Núcleo: modelos, API fluida, renderizado SVG, JSON, transformaciones |
| MatPlotLibNet.DataFrame | dotnet add package MatPlotLibNet.DataFrame | Métodos de extensión de Microsoft.Data.Analysis.DataFrame — plot, indicadores (SMA/EMA/RSI/MACD/…), y regresión polinómica a partir de columnas con nombre |
| MatPlotLibNet.Skia | dotnet add package MatPlotLibNet.Skia | Exportación a PNG, PDF y GIF animado mediante SkiaSharp |
| MatPlotLibNet.Blazor | dotnet add package MatPlotLibNet.Blazor | Componentes Razor MplChart + MplLiveChart con SignalR |
| MatPlotLibNet.AspNetCore | dotnet add package MatPlotLibNet.AspNetCore | Endpoints REST, hub de SignalR, IChartPublisher |
| MatPlotLibNet.Interactive | dotnet add package MatPlotLibNet.Interactive | figure.ShowAsync() — ventana emergente del navegador, sin necesidad de servidor |
| MatPlotLibNet.GraphQL | dotnet add package MatPlotLibNet.GraphQL | Consultas y suscripciones GraphQL mediante HotChocolate |
| MatPlotLibNet.Maui | dotnet add package MatPlotLibNet.Maui | MplChartView nativo mediante Microsoft.Maui.Graphics |
| MatPlotLibNet.Avalonia | dotnet add package MatPlotLibNet.Avalonia | MplChartControl nativo para Avalonia 12 — backend Skia, interacción local opcional |
| MatPlotLibNet.Uno | dotnet add package MatPlotLibNet.Uno | MplChartElement nativo para Uno Platform (WinUI 3 / Android / iOS / macCatalyst) |
| MatPlotLibNet.Wpf | dotnet add package MatPlotLibNet.Wpf | MplChartControl nativo de WPF mediante SkiaSharp — los 15 modificadores de interacción — y MplStreamingChartControl para datos en vivo; tu proyecto apunta a netX.0-windows10.0.19041.0 |
| MatPlotLibNet.Geo | dotnet add package MatPlotLibNet.Geo | 13 proyecciones de mapas, analizador GeoJSON, datos Natural Earth 110m, polígonos geográficos |
| MatPlotLibNet.Verso | Verso → panel Extensions | Un gráfico dentro de una celda de notebook de Verso, dibujado como SVG (cookbook) |
| MatPlotLibNet.Notebooks | #r "nuget: MatPlotLibNet.Notebooks" | SVG en línea en notebooks Polyglot / Jupyter. Microsoft ha terminado Polyglot Notebooks y .NET Interactive, sobre los que se construye este paquete, así que los notebooks existentes siguen funcionando pero no habrá nada nuevo — para trabajo nuevo usa MatPlotLibNet.Verso |
| MatPlotLibNet.Mcp | dnx MatPlotLibNet.Mcp | Servidor MCP — un agente de IA renderiza gráficos por stdio (cookbook) |
| @matplotlibnet/angular | npm install @matplotlibnet/angular | Componentes Angular + cliente SignalR de TypeScript |
| @matplotlibnet/react | npm install @matplotlibnet/react | Hooks y componentes de React + cliente SignalR de TypeScript |
| @matplotlibnet/vue | npm install @matplotlibnet/vue | Composables de Vue 3 + cliente SignalR de TypeScript |
Inicio rápido
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)
.AddSubPlot(1, 1, 1, ax => ax
.Plot(x, y, s => { s.Color = Colors.Blue; s.Label = "Data"; })
.WithLegend())
.Save("chart.svg");
Características
83 tipos de series — línea, dispersión (simple o coloreada por densidad de puntos), barras (simples, apiladas o varios grupos por categoría en una sola llamada), histograma, tarta, caja, violín, mapa de calor, contorno, velas, OHLC, treemap, sunburst, Sankey, polar, mapa de calor polar, superficie 3D, Bar3D, PlanarBar3D, Line3D, Trisurf3D, Contour3D, Quiver3D, Voxels, Text3D, radar, cascada, embudo, medidor, mosaico de estadística (KPI de valor único), línea de tiempo de estado (segmentos de estado discretos a lo largo del tiempo), cuadrícula de pares, gráfico de rotación relativa, línea/dispersión/señal/velas en streaming, y más. Sobre ellas, quince gráficos de una sola llamada (Lollipop, Dumbbell, Pareto, SlopeGraph, DotPlot, ParallelCoordinates, Marimekko, Ridgeline, QQPlot, KaplanMeier, BumpChart, ControlChart, StreamGraph, CalendarHeatmap, Spy) se construyen a partir de esas series, así que no añaden ninguna al recuento y viajan por JSON como sus partes.
Servidor MCP — gráficos para un agente de IA — MatPlotLibNet.Mcp es un
servidor de Model Context Protocol. Se distribuye como una herramienta de .NET que un host inicia por
stdio. Tiene cinco herramientas: render_chart (devuelve un PNG más un resumen de texto de lo que se dibujó), save_chart
(escribe PNG/SVG/PDF en un archivo y devuelve la ruta que escribió), chart_data_table (devuelve los números a partir de los que
se dibuja la imagen, como markdown, lo que una imagen sola no puede dar), list_chart_types y describe_chart_schema. La
especificación es el propio JSON de figura de la biblioteca, así que un agente puede pedir cualquier cosa que la biblioteca dibuje. Cuando una especificación es incorrecta,
el servidor la rechaza antes de renderizar y nombra el campo erróneo, en lugar de devolver una imagen en blanco. Consulta el
cookbook.
{ "servers": { "MatPlotLibNet.Mcp": { "type": "stdio", "command": "dnx", "args": ["MatPlotLibNet.Mcp", "--yes"] } } }
Sala de control — Plt.OpsDashboard() construye una pantalla de operador: mosaicos de KPI en la parte superior, líneas de tiempo de estado debajo, un panel de topología que muestra qué servicio llama a cuál (AddTopology), y un panel de tendencia compartido. Todos usan una ventana de tiempo que proporciona quien llama; la biblioteca nunca lee el reloj del sistema. Un mosaico lleva un Target, un Caption de varias líneas que se ajusta, un sparkline en línea y un OpsCondition que dice en qué consiste. Esa condición tiene dos ejes a propósito: OpsSeverity (normal, advertencia, crítico) es el único que compara, y OpsVisibility (observado, desconocido, archivado) dice si la lectura puede creerse y si alguien la silenció — una fuente silenciosa no es una degradada, y una alarma silenciada no es un problema resuelto. OpsCondition.RollUp lee un conjunto de hijos como lo hace un operador: el peor hijo visible decide el color, los no vistos y los silenciados se cuentan. WithEventMarker coloca un despliegue o un incidente en cada panel que tiene un reloj. Theme.Alarm define los colores de alarma reservados, y se incluyen cuatro fondos de operador. BulletGraphSeries sustituye al medidor radial.
Controles de interfaz nativos — MplChartControl para Avalonia 12 y MplChartElement para Uno Platform renderizan gráficos de forma nativa mediante SkiaSharp. No necesitan navegador, ni WebView, ni SignalR. Hay 15 modificadores de interacción: desplazamiento (arrastrar), zoom (desplazar), rotación 3D (arrastrar con el botón derecho), zoom rectangular (Ctrl+arrastrar), selección por pincel (Mayús+arrastrar), selección de rango (Alt+arrastrar), alternar leyenda (clic), restablecer (doble clic, Inicio o Escape), cursor de datos (clic en un punto para fijarlo), las herramientas de dibujo de línea de tendencia, niveles y Fibonacci, eliminar un dibujo seleccionado (Supr), cruz (pasiva) e información sobre herramientas al pasar el cursor. Los controles también tienen un modelo de estado de la barra de herramientas, historial de vistas (atrás/adelante), espejo de marcas y márgenes ajustados. Al hacer clic en un punto de datos se genera DataPointClicked con el punto en el que hizo clic el lector —serie, valor, posición en píxeles y ejes—, de modo que una aplicación puede abrir un panel de detalles o seleccionar una fila junto al gráfico. Un gráfico controlado por el servidor informa del mismo clic a su controlador OnDataCursor.
MathText — matemáticas en línea similares a LaTeX en cualquier etiqueta o título: $\alpha^{2}$, $\frac{a}{b}$, $\sqrt{x}$, $\hat{x}$, $\mathbf{F}$, $\mathbb{R}$. Admite 96 asignaciones de símbolos (griegos, operadores matemáticos, flechas, relaciones, conjuntos/lógica, negrita de pizarra), fracciones, raíces cuadradas, acentos, variantes de fuente, espaciado y delimitadores escalables.
Texto internacional — etiquetas, títulos y entradas de leyenda en cualquier escritura. El árabe y el hebreo funcionan con la fuente incluida: el algoritmo bidi de Unicode (UAX #9, los 861.948 casos de conformidad) determina la dirección de lectura, HarfBuzz da forma a cada tramo y los tramos se disponen en orden visual. SkiaFonts.Register(path) añade un archivo de fuente para devanagari, tailandés, chino y otras escrituras; el servidor MCP los toma de MATPLOTLIBNET_FONTS. La misma pasada de conformación produce la medición del texto, los contornos de glifos SVG y los píxeles PNG.
Gráficos 3D — 12 tipos de serie: Surface, Wireframe, Scatter3D, Stem3D, Bar3D, PlanarBar3D, Line3D, Trisurf3D (Delaunay), Contour3D (marching squares), Quiver3D (campo vectorial), Voxels (cubos con caras ocultas), Text3D (anotaciones). La compatibilidad 3D incluye una canalización Projection3D completa, un algoritmo del pintor DepthQueue3D, sombreado a partir de Vec3.FaceNormal más los métodos de extensión Color.Shade()/Color.Modulate(), Svg3DRotationScript para la rotación del lado del cliente con reordenación por profundidad, caras traseras derivadas de la cámara (CubeFaceSelection: los paneles, las aristas del cubo, las cuadrículas de las paredes y las filas de marcas siguen a la cámara en cualquier acimut, tanto en el servidor como durante un arrastre), un Pane3DConfig configurable (colores de suelo/pared) y compatibilidad con barras de color 3D.
Streaming y tiempo real — StreamingLineSeries, StreamingScatterSeries, StreamingSignalSeries y StreamingCandlestickSeries se basan en RingBuffer<T> y añaden puntos con AppendPoint(x, y). Un RingBuffer<T> es una secuencia circular de capacidad fija de cualquier tipo (64 M inserciones/s, y nunca asigna memoria al insertar). StreamingFigure proporciona rerenderizado limitado y ejes de escalado automático (SlidingWindow, StickyRight, AutoScale). 11 indicadores de streaming (SMA, EMA, RSI, Bollinger, MACD, OBV, ATR, Stochastic, WilliamsR, CCI, VWAP) se adjuntan automáticamente a los datos de velas. Existen controles de streaming para WPF, Avalonia, Uno, MAUI, Blazor y ASP.NET Core. La biblioteca incluye un motor de diferencias SVG para ahorrar ancho de banda y un adaptador IObservable<T> de Rx.
Proyecciones geográficas — el paquete MatPlotLibNet.Geo tiene 13 proyecciones cartográficas (PlateCarree, Mercator, TransverseMercator, Robinson, Orthographic, LambertConformal, AlbersEqualArea, AzimuthalEquidistant, EqualEarth, Mollweide, Natural Earth, Sinusoidal, Stereographic), un analizador GeoJSON, datos Natural Earth 110m integrados y GeoPolygonSeries para costas, fronteras y coropletas. Una escala de eje symlog maneja datos que abarcan rangos positivos y negativos.
SignalR bidireccional — gráficos interactivos con autoridad en el servidor con eventos de mutación (zoom, desplazamiento, restablecimiento, alternar leyenda) y eventos de notificación (selección por pincel, pasar el cursor, el punto de datos en el que se hizo clic). Los eventos forman una jerarquía de registros apilados, se combinan por sí solos y el servidor envía a cada llamador su propia respuesta de cursor.
Accesibilidad — figure.ToDataTables() proporciona a cada gráfico una tabla de datos junto a la imagen (ToHtml(), ToMarkdown(), ToCsv()). Esa tabla es la alternativa textual que WCAG 1.1.1 exige para una imagen compleja, y un <svg role="img"> no puede proporcionarla por sí solo. La tabla la sirven MapChartTableEndpoint, MplChart.ShowDataTable, el campo chartDataTable de GraphQL y la herramienta chart_data_table de MCP, que la devuelve como markdown para leer y como valores estructurados para calcular. La biblioteca también tiene roles y títulos ARIA, navegación por teclado, la paleta segura para daltonismo Okabe-Ito, las tres secuencias de colores accesibles de Petroff y un tema de alto contraste.
148 mapas de color — viridis, plasma, turbo, coolwarm y 144 más (74 mapas base, cada uno con una variante _r invertida registrada automáticamente). La biblioteca también tiene numérica SIMD al estilo NumPy (Vec, Mat, Linalg, Fft), temas que se parecen a los de matplotlib, integración con DataFrame con 58 indicadores técnicos, ejes rotos y exportación SVG/PNG/PDF/GIF con calidad de publicación.
Licencia
MIT — gratuita para cualquier uso, de código abierto o comercial, sin condiciones de copyleft.