matplotlibnet について
MatPlotLibNet は .NET 10 と .NET 8 向けの C# グラフライブラリで、サーバーコードから描画して出力できます。MCP パッケージを使うと、AI エージェントがライブラリの JSON 図仕様でグラフを作成し、データをテキストで取得できます。
主な機能
- 0183 種類のグラフ
- 02SVG、PNG、PDF、GIF 出力
- 03流暢な C# API
- 04JSON 図仕様
- 05MCP による描画とデータ取得
活用シーン
- 01エージェント作成の仕様からグラフを描画
- 02グラフを各種形式で保存
- 03描画データを表形式で取得
- 04対応するグラフとスキーマを確認
MCP 対応
MatPlotLibNet.Mcp パッケージは stdio MCP サーバーを提供します。グラフの描画・保存、データテーブルの返却、グラフの種類とスキーマの説明に使うツールを備えています。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
MatPlotLibNet — .NET 向け matplotlib
MatPlotLibNet は、matplotlib に着想を得た、C#、.NET 10、.NET 8 向けのグラフ描画ライブラリです。83 種類のグラフを描画し、サーバーコードから直接、SVG、PNG、PDF、またはアニメーション GIF として保存できます。JavaScript フレームワーク、WebView、ホスト型サービスは不要です。
流暢な API を備え、依存性注入に対応しています。148 種類のカラーマップ、30 種類のテーマ、Natural Earth データを埋め込んだ 13 種類の地図投影法、LaTeX 風の MathText、あらゆる文字体系のテキスト、58 種類のテクニカル指標に対応した O(1) のストリーミング、コントロールルーム(Plt.OpsDashboard() — KPI タイル、状態のタイムライン、共有トレンドウィンドウ 1 つ)、そして AI エージェントがグラフを描画できる MCP サーバーが付属しています。グラフは Blazor、WPF、MAUI、Avalonia、Uno、ASP.NET Core でネイティブにレンダリングできるほか、Verso ノートブックのセル内でも表示でき、Angular、React、Vue 向けの TypeScript クライアントも用意されています。
今後の展望
1.23.0 では、ローソク足の始値、高値、安値、終値、出来高を参照するテクニカル指標が、個別の配列パラメーターではなく、OhlcvBars という単一の値を使うようになりました。OhlcvBars.Hlc(high, low, close) や OhlcvBars.Cv(close, volume) など、指標が実際に使う列に名前を付けるファクトリーで作成するため、チャート上のすべての指標で同じ配列を繰り返し指定する必要はありません。スケールが 2 つを超えるチャートでも、追加のスケールを配置できるようになりました。WithOutwardYAxis は、matplotlib が双子軸の背骨を外側へ移動するように、左右どちらでも 2 本目の軸を 1 本目の外側に積み重ねます。合計 4 スケール、左右それぞれ 2 本で、それぞれに独自の範囲、目盛り、系列、凡例項目を設定できます。セカンダリ軸もプライマリ軸と同じレジストリを通じて復元されるため、線や点だけでなく、棒グラフや面グラフもセカンダリ軸と上部の軸で保持されます。また、ホイールズーム、ドラッグによるパン、矩形ズーム、Home の操作で、サーバーがジェスチャーに応答する場合もネイティブコントロールが応答する場合も、すべての軸がそれぞれ独自の量だけ移動します。内部では、流暢な API が構築する 100 近くのグラフ用動詞が、すべて 1 つのクラスを共有するのではなく、Axes の拡張メンバーとしてファイルごとに分かれました。これはファイル構成のみの変更であり、利用者が記述する呼び出しに違いはありません。
1.22.0 では、複数の系列でテーマのカラーサイクルから順番に色を割り当てるのではなく、同じ色を共有できるようになりました。この機能は 3 つの用途に使われています。Kaplan-Meier 曲線では信頼帯と打ち切りマークが曲線と同じ色で描画されるようになり、2 つの新しい動詞 Raincloud(半分のバイオリン、細い箱ひげ、グループの生データ点を 1 色で表示)と Horizon(符号付きの系列を 2 色相の帯に折りたたんで表示)が追加され、Axes ビルダーの動詞は 17 種類になりました。
1.21.0 では、すべてのグラフタイプと Axes の設定を、欠落なく JSON との間で往復できるようになりました。Sankey のノードとリンク、treemap、sunburst、dendrogram、clustermap のツリー、tree grid の行、polar chart のデータ、ストリーミングチャートの現在の点、平面 3D 棒グラフのデータが、プレースホルダーではなく、JSON からそれぞれ本来の形式で復元されます。MCP サーバー では、この 8 種類すべてが再び一覧表示され、受け付けられるようになりました。以前は名前を挙げて拒否されていました。Axes の Z 軸、3D ペインの色、ツールチップの切り替え設定も復元されます。このリリースで対応できなかった唯一の系列は、ロードマップに記載されている MatPlotLibNet.Geo の GeoPolygonSeries です。
1.20.0では、1ページ分のコードが必要だったチャートを1回の呼び出しで作成できます。軸ビルダーに追加された15個の動詞のうち、Pareto、Ridgeline、CalendarHeatmap、QQPlot、ControlChart、KaplanMeier、StreamGraph、Marimekkoは、手元にあるデータ(名前、グループ、サンプル、日付)を受け取り、ライブラリにすでにある系列からチャートを作成します。その基盤では、JSONに書き出した図を読み戻すと、描画設定をすべて含めて元の図が再現されるようになり、MCP サーバーとすべてのトランスポートで完全な状態が保たれます。欠損値として扱われるのはNaNだけです。matplotlibと同様に、線は欠損箇所で途切れ、NaNの位置には何も描画されません。対数軸上の棒は下端まで伸び、横棒も機能します。カテゴリ名は軸タイトルのスペースを確保した目盛りラベルになり、WithDpiとSaveOptionsがファイル出力にも反映されるようになりました。新しい呼び出しはすべて、Wikiのサンプルページにコードで掲載されています。
1.19.0は、複数の線と複数の軸があるチャート向けです。WithDirectLabel()は凡例の代わりに、線の名前を線と同じ色で末端に表示します。また、SetYAxisColor/SetXAxisColorを使うと、左、下、右、上のいずれの軸も1回の呼び出しで線に合わせた色にできます。右軸と上軸は、それぞれ独自の目盛り設定に従い、レイアウトで個別のスペースを確保し、JSON経由でも色が保持されるようになりました。また、それらの軸上の線は、凡例項目をクリックすると非表示になります。サーバー上のインタラクティブなチャートや、WPF、Avalonia、Unoのコントロールでは、ホバー、選択、ズーム、パン、データカーソルが、対数軸でも読者に表示される値を報告します。また、設定した軸の範囲は、逆順かどうかにかかわらず、描画される範囲と正確に一致するようになりました。新しい呼び出しはすべて、Wikiのサンプルページにコードで掲載されており、Wiki内のすべてのC#サンプルがコンパイルされるようになりました。
以降のリリースは、コミュニティのニーズに応じて、バグ修正、ドキュメントの改善、実際の利用で出てきた要望に対応します。ディスカッションまたはIssueをお寄せください。それをもとに次のリリースを決定します。各リリースと移行に関する注意事項はCHANGELOGに掲載されています。また、ロードマップでは、完了した項目、今後の予定、意図的に対象外とした項目を説明しています。項目ごとのセクションはWikiのページにあります。
品質基準:すべてのクラスが、19,995件のテストで厳格なカバレッジ基準(行カバレッジ90%以上、分岐カバレッジ90%以上)を満たす必要があります(848クラス、行カバレッジ99.7%/分岐カバレッジ98.5%)。別個のテストスイート(Tst/MatPlotLibNet.Fidelity)では、描画結果をmatplotlibで作成した参照画像と比較します。このテストスイートはCI実行には含まれません。
ドキュメント
- Wiki — 入門、チートシート、全83種類のチャート、コントロールルーム、スタイル設定、ストリーミング、SignalR、パッケージ
- matplotlibからC#へ — おなじみのpyplot呼び出しと、ここで描画するコード
- Cookbook — 描画結果付きのコピー&ペースト可能なサンプル
- Playground — ブラウザーでチャートをリアルタイムに試す
- APIリファレンス — XMLドキュメントから生成
- ロードマップ — 完了した項目と今後の予定を、各項目が上の項目を必要とする順に掲載しています。Wikiのページでは、各項目に必要な内容と、意図的に対象外とした内容を説明しています
- ベンチマーク · カバレッジ方針 · CHANGELOG
パッケージ
| パッケージ | インストール | 機能 |
|---|---|---|
| MatPlotLibNet | dotnet add package MatPlotLibNet | コア:モデル、Fluent API、SVG レンダリング、JSON、変換 |
| MatPlotLibNet.DataFrame | dotnet add package MatPlotLibNet.DataFrame | Microsoft.Data.Analysis.DataFrame の拡張メソッド — プロット、指標(SMA/EMA/RSI/MACD/…)、名前付き列を使用した多項式回帰 |
| MatPlotLibNet.Skia | dotnet add package MatPlotLibNet.Skia | SkiaSharp による PNG、PDF、アニメーション GIF のエクスポート |
| MatPlotLibNet.Blazor | dotnet add package MatPlotLibNet.Blazor | SignalR を使用する MplChart と MplLiveChart の Razor コンポーネント |
| MatPlotLibNet.AspNetCore | dotnet add package MatPlotLibNet.AspNetCore | REST エンドポイント、SignalR ハブ、IChartPublisher |
| MatPlotLibNet.Interactive | dotnet add package MatPlotLibNet.Interactive | figure.ShowAsync() — ブラウザーのポップアップ。サーバーは不要です |
| MatPlotLibNet.GraphQL | dotnet add package MatPlotLibNet.GraphQL | HotChocolate による GraphQL クエリとサブスクリプション |
| MatPlotLibNet.Maui | dotnet add package MatPlotLibNet.Maui | Microsoft.Maui.Graphics によるネイティブ MplChartView |
| MatPlotLibNet.Avalonia | dotnet add package MatPlotLibNet.Avalonia | Avalonia 12 向けネイティブ MplChartControl — Skia バックエンド、ローカル操作はオプション |
| MatPlotLibNet.Uno | dotnet add package MatPlotLibNet.Uno | Uno Platform(WinUI 3 / Android / iOS / macCatalyst)向けネイティブ MplChartElement |
| MatPlotLibNet.Wpf | dotnet add package MatPlotLibNet.Wpf | SkiaSharp によるネイティブ WPF MplChartControl — 15 種類すべてのインタラクション修飾子に対応 — およびライブデータ用の MplStreamingChartControl。プロジェクトのターゲットは netX.0-windows10.0.19041.0 です |
| MatPlotLibNet.Geo | dotnet add package MatPlotLibNet.Geo | 13 種類の地図投影法、GeoJSON パーサー、Natural Earth 110m データ、地理ポリゴン |
| MatPlotLibNet.Verso | Verso → 拡張機能パネル | SVG として描画される Verso ノートブックセル内のグラフ(クックブック) |
| MatPlotLibNet.Notebooks | #r "nuget: MatPlotLibNet.Notebooks" | Polyglot / Jupyter ノートブック内のインライン SVG。このパッケージが基盤としている Polyglot Notebooks と .NET Interactive は Microsoft により終了されました。そのため既存のノートブックは引き続き動作しますが、新しい開発は予定されていません。新規開発には MatPlotLibNet.Verso を使用してください |
| MatPlotLibNet.Mcp | dnx MatPlotLibNet.Mcp | MCP サーバー — AI エージェントが stdio 経由でグラフをレンダリングします(クックブック) |
| @matplotlibnet/angular | npm install @matplotlibnet/angular | Angular コンポーネント + TypeScript SignalR クライアント |
| @matplotlibnet/react | npm install @matplotlibnet/react | React フック + コンポーネント + TypeScript SignalR クライアント |
| @matplotlibnet/vue | npm install @matplotlibnet/vue | Vue 3 のコンポーザブル + TypeScript SignalR クライアント |
クイックスタート
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");
機能
83 種類の系列タイプ — 折れ線、散布図(通常または点密度で色分け)、棒グラフ(通常、積み上げ、または1回の呼び出しでカテゴリごとに複数グループ)、ヒストグラム、円グラフ、箱ひげ図、バイオリンプロット、ヒートマップ、等高線、ローソク足、OHLC、ツリーマップ、サンバースト、サンキー、極座標、極座標ヒートマップ、3D サーフェス、Bar3D、PlanarBar3D、Line3D、Trisurf3D、Contour3D、Quiver3D、ボクセル、Text3D、レーダー、ウォーターフォール、ファンネル、ゲージ、統計タイル(単一値 KPI)、状態タイムライン(時間経過に伴う離散的な状態セグメント)、ペアグリッド、相対回転グラフ、ストリーミング折れ線/散布図/シグナル/ローソク足など。これらを基に、15 種類のワンコールチャート(Lollipop、Dumbbell、Pareto、SlopeGraph、DotPlot、ParallelCoordinates、Marimekko、Ridgeline、QQPlot、KaplanMeier、BumpChart、ControlChart、StreamGraph、CalendarHeatmap、Spy)が構築されているため、系列数には追加されず、構成要素として JSON 経由で受け渡されます。
MCP サーバー — AI エージェント向けのチャート — MatPlotLibNet.Mcp は
Model Context Protocol サーバーです。.NET ツールとして提供され、ホストが stdio 経由で起動します。5 つのツールを備えています。render_chart(描画した内容のテキスト要約と PNG を返します)、save_chart
(PNG/SVG/PDF をファイルに書き込み、書き込んだパスを返します)、chart_data_table(画像だけでは得られない、描画元の数値を Markdown 形式で返します)、list_chart_types、describe_chart_schema です。仕様にはライブラリ独自の図 JSON を使うため、エージェントはライブラリで描画できるものなら何でも要求できます。仕様に誤りがある場合、サーバーは描画前に拒否し、誤ったフィールド名を示します。空白の画像を返すことはありません。
クックブックをご覧ください。
{ "servers": { "MatPlotLibNet.Mcp": { "type": "stdio", "command": "dnx", "args": ["MatPlotLibNet.Mcp", "--yes"] } } }
コントロールルーム — Plt.OpsDashboard() は、上部に KPI タイル、その下に状態タイムライン、どのサービスがどのサービスを呼び出しているかを示すトポロジーパネル(AddTopology)、共有トレンドパネルを配置した、オペレーター向けの画面を構築します。すべて呼び出し元が指定する 1 つの時間枠を使用し、ライブラリが現在時刻を読み取ることはありません。タイルには Target、折り返し表示される複数行の Caption、インラインのスパークライン、現在の状態を示す OpsCondition が含まれます。この状態には、意図的に 2 つの軸があります。OpsSeverity(正常、警告、重大)は比較対象となる唯一の軸で、OpsVisibility(観測済み、不明、抑制中)は読み取りを信頼できるか、誰かが通知を停止したかを示します。通知が途絶えたソースは劣化したソースとは異なり、ミュートされたアラームも問題が解決したことを意味しません。OpsCondition.RollUp は、オペレーターと同じように子要素の集合を評価します。見える範囲で最も深刻な子要素が色を決め、見えない子要素とミュートされた子要素はそれぞれ集計されます。WithEventMarker は、時計を備えたすべてのパネルにデプロイやインシデントを表示します。Theme.Alarm はアラーム専用の色を定義し、4 種類のオペレーター向け背景色が用意されています。BulletGraphSeries はラジアルゲージに代わるものです。
ネイティブ UI コントロール — Avalonia 12 向けの MplChartControl と Uno Platform 向けの MplChartElement は、SkiaSharp を介してチャートをネイティブに描画します。ブラウザー、WebView、SignalR は不要です。15 種類の操作モディファイアーを備えています。パン(ドラッグ)、ズーム(スクロール)、3D 回転(右ボタンドラッグ)、範囲ズーム(Ctrl+ドラッグ)、ブラシ選択(Shift+ドラッグ)、範囲選択(Alt+ドラッグ)、凡例の切り替え(クリック)、リセット(ダブルクリック、Home または Escape)、データカーソル(点をクリックして固定)、トレンドライン、レベル、フィボナッチの描画ツール、選択した描画の削除(Delete)、クロスヘア(パッシブ)、ホバーツールチップです。コントロールには、ツールバーの状態モデル、表示履歴(戻る/進む)、目盛りのミラーリング、余白の詰め込み機能もあります。データ点をクリックすると、クリックした点(系列、値、ピクセル位置、軸)を含む DataPointClicked が発生します。これにより、アプリケーションは詳細パネルを開いたり、チャートの横にある行を選択したりできます。サーバー駆動のチャートは、同じクリックを OnDataCursor ハンドラーに通知します。
MathText — ラベルやタイトル内で LaTeX 風のインライン数式を使用できます。$\alpha^{2}$、$\frac{a}{b}$、$\sqrt{x}$、$\hat{x}$、$\mathbf{F}$、$\mathbb{R}$ に対応しています。96 種類の記号マッピング(ギリシャ文字、数学演算子、矢印、関係記号、集合/論理、黒板太字)、分数、平方根、アクセント、フォントバリアント、間隔、拡大縮小可能な区切り記号をサポートしています。
国際テキスト — あらゆる文字体系のラベル、タイトル、凡例項目に対応しています。アラビア語とヘブライ語は同梱フォントで表示できます。Unicode 双方向アルゴリズム(UAX #9、適合性テストケース 861,948 件すべて)が読み取り方向を判定し、HarfBuzz が各ランを字形化して、ランを視覚的な順序で配置します。SkiaFonts.Register(path) でデーヴァナーガリー文字、タイ文字、中国語などの文字体系のフォントファイルを追加できます。MCP サーバーは MATPLOTLIBNET_FONTS からフォントを読み込みます。同じシェーピング処理によって、テキストの計測、SVG の字形アウトライン、PNG のピクセルが生成されます。
3D グラフ — 12 種類の系列タイプ:Surface、Wireframe、Scatter3D、Stem3D、Bar3D、PlanarBar3D、Line3D、Trisurf3D(Delaunay)、Contour3D(マーチングスクエア)、Quiver3D(ベクトル場)、Voxels(隠面消去を行う立方体)、Text3D(注釈)。3D サポートには、完全な Projection3D パイプライン、DepthQueue3D ペインターアルゴリズム、Vec3.FaceNormal と Color.Shade()/Color.Modulate() 拡張メソッドによるシェーディング、深度を再ソートするクライアント側の回転機能を備えた Svg3DRotationScript、カメラから導出される背面(CubeFaceSelection:ペイン、立方体の辺、壁のグリッド、目盛り行が、サーバー側でもドラッグ中でも、あらゆる方位でカメラに追従)、設定可能な Pane3DConfig(床/壁の色)、3D カラーバーのサポートが含まれます。
ストリーミングとリアルタイム — StreamingLineSeries、StreamingScatterSeries、StreamingSignalSeries、StreamingCandlestickSeries は RingBuffer<T> を基盤とし、AppendPoint(x, y) で点を追加します。RingBuffer<T> は、任意の型に対応した固定容量の循環シーケンスです(1 秒あたり 6,400 万回の追加が可能で、追加時にメモリ割り当ては発生しません)。StreamingFigure は、再描画のスロットリングと軸の自動スケーリング(SlidingWindow、StickyRight、AutoScale)を提供します。11 種類のストリーミング指標(SMA、EMA、RSI、Bollinger、MACD、OBV、ATR、Stochastic、WilliamsR、CCI、VWAP)が、ローソク足データに自動的に適用されます。WPF、Avalonia、Uno、MAUI、Blazor、ASP.NET Core 向けのストリーミングコントロールを利用できます。ライブラリには帯域幅を節約する SVG 差分エンジンと、Rx IObservable<T> アダプターも含まれます。
地図投影法 — MatPlotLibNet.Geo パッケージには、13 種類の地図投影法(PlateCarree、Mercator、TransverseMercator、Robinson、Orthographic、LambertConformal、AlbersEqualArea、AzimuthalEquidistant、EqualEarth、Mollweide、Natural Earth、Sinusoidal、Stereographic)、GeoJSON パーサー、埋め込み済みの Natural Earth 110m データ、海岸線、国境、コロプレス図に対応する GeoPolygonSeries が含まれます。正の範囲と負の範囲にまたがるデータには、symlog 軸スケールを使用できます。
双方向 SignalR — ミューテーションイベント(ズーム、パン、リセット、凡例の切り替え)と通知イベント(範囲選択、ホバー、クリックされたデータポイント)に対応した、サーバー主導のインタラクティブなグラフです。イベントは階層化されたレコードとして構成され、自動的にマージされます。また、サーバーは各呼び出し元に個別のホバー応答を送信します。
アクセシビリティ — figure.ToDataTables() を使用すると、すべてのグラフに画像と並べてデータテーブルを表示できます(ToHtml()、ToMarkdown()、ToCsv())。このテーブルは、複雑な画像に対して WCAG 1.1.1 が求めるテキストによる代替情報です。<svg role="img"> だけではその役割を果たせません。テーブルは MapChartTableEndpoint、MplChart.ShowDataTable、GraphQL の chartDataTable フィールド、MCP の chart_data_table ツールから提供されます。MCP ツールは、読み取り用の Markdown と、計算用の構造化値を返します。ライブラリには、ARIA ロールとタイトル、キーボード操作、色覚多様性に配慮した Okabe-Ito パレット、3 種類の Petroff アクセシブルカラーシーケンス、高コントラストテーマも備わっています。
148 種類のカラーマップ — viridis、plasma、turbo、coolwarm、その他 144 種類(74 種類のベースマップには、それぞれ反転版 _r が自動登録されています)。また、NumPy スタイルの SIMD 数値演算(Vec、Mat、Linalg、Fft)、matplotlib 風のテーマ、58 種類のテクニカル指標に対応した DataFrame 統合、軸の一部省略、出版品質の SVG/PNG/PDF/GIF エクスポートも利用できます。
ライセンス
MIT — コピーレフト条件はなく、オープンソースでも商用でも、あらゆる用途に無料で使用できます。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。