我的主力開發語言是 C#,能用 Matplotlib 輕鬆繪製圖表是我有時改用 Python 的理由。但有很多情境是,大半處理流程已用 C# 寫好且運作流暢,只為區區圖表在最後一百公尺鬼切 Python,讓架構硬生生變複雜,怎麼想都不划算。

堂堂 C#,總不會連畫個簡單長條圖或折線圖都得外包?

TIOBE 排名第五名,並榮獲 2023 年度程式語言的 C#,普遍度雖然比不上 Python、JavaScript 或 Java,但開源社群及生態系也不至讓人失望~ 有個開源 C# 圖表程式庫 - ScottPlot,支援許多種專業圖表,在 .NET 專案用 NuGet 下載後便能輕鬆畫圖:

如果是 Windows Form/WPF/Blazor 程式,ScottPlot 還支援拖拉縮放等互動操作:

學習 ScottPlot 最好的方法是下載 Demo 程式實際體驗,Cookbook 有完整功能展示並可互動操作玩看看,並都有附上範例原始碼:

值得一提的是,互動模式除了基本的拖拉及縮放,ScottPlot 還加入不少酷炫功能,像是拖拉移動資料點選取範圍內資料點多圖 X 軸同步捲動串流資料顯示股票 K 線即時更新... 等。(細節可參考官方網站)

做了簡單評估,ScottPlot 的圖表種類、設定彈性及成熟度不及 Matplotlib (二者 Github 星星數為 5K vs 20K,非屬同一量級),加上 ChatGPT 及 Github Copilot 等 AI 工具較熟悉 Matplotlib,能給更完整且精準的建議,Matplotlib 仍是繪製專業圖表較佳的選擇。但對 .NET 專案來說,簡單圖表需求用 ScottPlot 搞定,殺雞不需用牛刀,比串接 Python 輕巧。至於複雜圖表要求,我應該還是會選擇匯出處理結果用 Python + Matlibplot 畫圖,或是直接改用 Python 處理。

最後,來個玫瑰曲線練習結束這回合。

using ScottPlot;

var pointCount = 1000;
var n = 4;

double[] theta = Enumerable.Range(0, pointCount).Select(o => 2 * Math.PI * o / pointCount).ToArray();
double[] r = theta.Select((v, i) => Math.Sin(n * v)).ToArray();
double[] x = r.Select((v, i) => v * Math.Cos(theta[i])).ToArray();
double[] y = r.Select((v, i) => v * Math.Sin(theta[i])).ToArray();

ScottPlot.Plot myPlot = new();
myPlot.Add.ScatterLine(x, y);
myPlot.SavePng("rose.png", 400, 400);

成品如下:

Exploring ScottPlot, an open-source C# charting library for creating professional charts without switching to Python. It supports various interactive features and can be easily integrated into .NET projects.


Comments

Be the first to post a comment

Post a comment