ScottPlot 从零上手:.NET 数据可视化 10 分钟出第一张图
【免费下载链接】ScottPlotInteractive plotting library for .NET项目地址: https://gitcode.com/gh_mirrors/sc/ScottPlot
手边有一份 200 行的销售 CSV,下午要交一张趋势图。想在 .NET 里做数据可视化,又不想为此临时啃一套绘图 API——ScottPlot 从装包到出图,10 分钟能走完。
它是什么
ScottPlot 是一个 MIT 协议的 .NET 开源绘图库:核心包只负责把数据画成位图,再往上提供 WinForms、WPF、Avalonia、Blazor 等 UI 控件包,负责把图嵌进窗口并支持缩放平移。它适合要"几行代码出一张图"的开发者。和 LiveCharts、OxyPlot 这类库的分水岭在于底层用 SkiaSharp 自绘,不依赖宿主框架的绘图原语,所以同一个Plot对象既能存 PNG,也能塞进任何支持 SkiaSharp 的界面。
装之前确认这几项
- .NET SDK 8 或更高版本,先
dotnet --list-sdks确认;核心库同时支持 .NET Framework 4.6.2 与 .NET Standard 2.0 - 你的项目是普通类库/控制台还是 UI 项目——决定装核心包还是连带控件包
- NuGet 源默认指向 nuget.org,公司内网换源后也能搜到 ScottPlot
- 若要改源码:仓库为 https://gitcode.com/gh_mirrors/sc/ScottPlot ,本地编译 src/ScottPlot5/ScottPlot5.sln
- 渲染走 SkiaSharp,Windows/macOS 开箱即用,Linux 可能需要补字体库
装完直接出图
命令行安装
在装好的项目目录里执行下面一条命令,NuGet 会解析出 SkiaSharp 等依赖并写入 csproj;Package Manager Console 里的备选是Install-Package ScottPlot。
dotnet add package ScottPlot最小出图示例
下面这段代码创建 600x400 的图,画一条二次曲线,存成 PNG;运行后工作目录会出现 quickstart.png,打开确认坐标轴、网格、图线都正常即算跑通。
var plt = new ScottPlot.Plot(600, 400); double[] xs = { 1, 2, 3, 4, 5 }; double[] ys = { 1, 4, 9, 16, 25 }; plt.Add.Scatter(xs, ys); plt.SaveFig("quickstart.png");能画什么、能跑在哪
| 图表类型 | API |
|---|---|
| 折线 | Add.Signal |
| 散点 | Add.Scatter |
| 柱状 | Add.BarPlot |
| 箱线 | Add.BoxPlot |
| 蜡烛 | Add.OHLC |
| 热图 | Add.Heatmap |
| 直方图 | Add.Histogram |
| 饼图 | Add.Pie |
| UI 框架 | 控件 | 包 |
|---|---|---|
| WinForms | FormsPlot | ScottPlot.WinForms |
| WPF | WpfPlot | ScottPlot.WPF |
| Avalonia | AvaPlot | ScottPlot.Avalonia |
| Blazor | BlazorPlot | ScottPlot.Blazor |
操作系统覆盖 Windows、macOS、Linux;不嵌界面的场景直接用核心包存图即可。
按框架初始化
WinForms 初始化差异
控件包是 ScottPlot.WinForms,把 FormsPlot 加到窗体并 Dock 为 Fill,之后通过 Plot 属性画图,每次改动后调 Refresh()。
var fp = new ScottPlot.WinForms.FormsPlot { Dock = DockStyle.Fill }; fp.Plot.Add.Scatter(xs, ys); fp.Refresh();WPF 初始化差异
控件包是 ScottPlot.WPF,XAML 里要声明 wpf 命名空间,C# 代码改图后调 Refresh() 重绘。
xmlns:wpf="clr-namespace:ScottPlot.WPF;assembly=ScottPlot.WPF" <wpf:WpfPlot Name="WpfPlot1" />WpfPlot1.Plot.Add.Scatter(xs, ys); WpfPlot1.Refresh();Blazor 初始化差异
控件包是 ScottPlot.Blazor,razor 里放 BlazorPlot,通过 @ref 取到组件后在生命周期方法里加数据;它和 WPF 的关键差别是多一次组件引用和一次显式 Refresh。
<BlazorPlot @ref="Plot" /> @code { ScottPlot.Blazor.BlazorPlot Plot; protected override void OnInitialized() => Plot.Plot.Add.Scatter(xs, ys); }高频坑与解法
现象:编译报 SkiaSharp 程序集版本冲突或 TypeLoadException。根因:工程里其他包引用了不同版本的 SkiaSharp,运行时加载了错的那份。一行修复:用包管理器把 ScottPlot 与 ScottPlot.* 全部统一升到 5.1.x,让 NuGet 一并协调 SkiaSharp 版本。
现象:Linux 上窗体能打开但图区空白。根因:缺少 libfontconfig 等 SkiaSharp 运行库。一行修复:sudo apt install libfontconfig1 fontconfig,重开应用即恢复。
现象:百万点散点拖拽缩放明显卡顿。根因:Scatter 每帧对全部点逐点连线;Signal 数据源有分段 min/max 缓存,同规模下开销低得多。一行修复:把Add.Scatter(xs, ys)换成Add.Signal(ys),交互立刻恢复流畅。
现象:标题里中文或希腊字母渲染成方块。根因:系统没有对应字形,SkiaSharp 找不到 CJK 字体。一行修复:Linux 上先装fonts-noto-cjk,再在代码里把plt.Fonts.Default指定为系统中真实存在的中文字体名。
延伸阅读
- 官方文档站 scottplot.net:查 API 语义、交互行为和跨框架差异,以在线文档为准
- Cookbook 示例(仓库内
src/ScottPlot5/ScottPlot5 Cookbook/Recipes/):按图表类型组织的可运行代码,照着抄最快 - 演示项目(
src/ScottPlot5/ScottPlot5 Demos/):各框架下的完整交互窗口,确认控件行为时可对照 - 核心库源码(
src/ScottPlot5/ScottPlot5/Plottables/):每个 Plottable 一个文件,需要改渲染逻辑时从这里下手
【免费下载链接】ScottPlotInteractive plotting library for .NET项目地址: https://gitcode.com/gh_mirrors/sc/ScottPlot
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考