0


C# Scott Plot 开源图标组件

介绍一个功能完善, 性能强悍的图表组件库 ScottPlot

https://github.com/ScottPlot/ScottPlot

https://github.com/ScottPlot/ScottPlot/releases?page=11

https://scottplot.net/cookbook/3.1/

https://github.com/ScottPlot/ScottPlot.NET/blob/main/content/faq/live-data/index.md

ScottPlot 是一个 .NET 图表组件, 主要有以下特点:

  • 适用范围广:同时适用于 WinForms, WPF, Avalonia, Console, 支持 .NET Framework 4.6.1 及以上, NET Core 2.0 至 .NET 5。

  • 上手简单:只需几行代码即可创建折线图、条形图、饼图、散点图等。

  • 性能强悍:千万级数据处理无压力, 媲美 Python Matplotlib。

  • 可交互:支持用户和图表数据进行交互, 注入灵魂。

  • 开源免费:基于MIT开源协议, 已经开源近5年, 不存在版权和收费问题

  • 组件丰富:图表组件非常全面,可满足各种场景下的展示需求。

图表接入

⚡ Winform

  1. 通过Nuget安装 ScottPlot.WinForms。

  2. 安装完成后, 就可以在工具箱找到 ScottPlot 组件, 然后拖到 Winform 窗体上。

  3. 填充图表数据, 完成!

double[] dataX = newdouble[] {1, 2, 3, 4, 5};
double[] dataY = newdouble[] {1, 4, 9, 16, 25};
formsPlot1.Plot.AddScatter(dataX, dataY);
formsPlot1.Refresh();

⚡ WPF

  1. 通过Nuget安装 ScottPlot.WPF

  2. 添加一个 WpfPlot 组件到布局中, 并设置Name

<WpfPlot Name="WpfPlot1" />
  1. 同样, 填充图表数据, 完成!
double[] dataX = newdouble[] { 1, 2, 3, 4, 5 };
double[] dataY = newdouble[] { 1, 4, 9, 16, 25 };
WpfPlot1.Plot.AddScatter(dataX, dataY);
WpfPlot1.Refresh();

⚡ Console App

当然也可以在控制台应用中使用该图表组件, 和上面不同的是, 它会渲染成一张图片, 然后可以保存到本地

  1. 通过Nuget安装 ScottPlot

  2. 填充图表数据并保存为图片

图表示例

项目背后的故事

wow, 很优秀的开源项目, 但其实我还想分享一些项目背后的故事, 因为这非常有意义!

ScottPlot 图表库 的作者是 Scott W Harden, 他是一名生物研究科学家, 目前在神经科学实验室工作, 他的主要专业是分子生物学、牙科和神经科学, 但是也对计算机编程和电气工程充满热情, 所以偶尔会编写代码来完成与科学研究相关的任务。

像很多科学家一样, Scott 也使用 Python 流行的的 matplotlib 处理数据, 但是发现在给一些不太懂计算机的用户安装软件时, 总会出现一些环境问题, 配置问题等等, 所以他在2017年做了个决定, 学习.NET 技术栈, 主要用来开发用于科学研究的桌面应用程序。

但是问题来了, 当他尝试用 C# 绘制 WAV 文件中的数据时,发现非常困难, Python 中的微不足道的任务在 C# 中似乎非常困难, 虽然有免费的图表库, 但是当加载了千万级的数据时就开始有各种问题了,有一些商业图表库好像可以用,但既复杂又昂贵, 有些库仅适用于 Winforms,有些仅适用于 WPF,而且许多库具有复杂的数据对象模型,对于 .NET 新手来说非常难以理解, 于是作者就自己实现了图表组件, 这就是 ScottPlot 初版, 然后就开源在了github, 经过几年的逐步更新迭代, ScottPlot 变成了一个功能丰富, 成熟稳定的图表组件库。

https://github.com/ScottPlot/ScottPlot

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

namespace ScottPlotQuickstartForms

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

static int cnt = 0;

readonly double[] Values = new double[100_000];

//readonly ScottPlot.Plottable.SignalPlot SignalPlot;

int NextPointIndex = 0;

private void Form1_Load(object sender, EventArgs e)

{

int pointCount = 50;

double[] dataXs = new double[pointCount];

double[] dataSin = new double[pointCount];

double[] dataCos = new double[pointCount];

for (int i = 0; i < pointCount; i++)

{

dataXs[i] = i;

dataSin[i] = Math.Sin(i * 2 * Math.PI / pointCount);

dataCos[i] = Math.Cos(i * 2 * Math.PI / pointCount);

}

//scottPlotUC1.plt.PlotScatter(dataXs, dataSin);

//scottPlotUC1.plt.PlotScatter(dataXs, dataCos);

//scottPlotUC1.plt.XLabel("experiment time (ms)");

//scottPlotUC1.plt.YLabel("signal (mV)");

//scottPlotUC1.plt.Title("ScottPlot Quickstart");

//scottPlotUC1.plt.AxisAuto();

//scottPlotUC1.Render();

}

private void scottPlotUC1_Load(object sender, EventArgs e)

{

}

private void timer1_Tick(object sender, EventArgs e)

{

int pointCount = 150;

double[] dataXs = new double[pointCount];

double[] dataSin = new double[pointCount];

double[] dataCos = new double[pointCount];

scottPlotUC1.plt.Clear();

for (int i = 0; i < pointCount; i++)

{

dataXs[i] = i;

dataSin[i] = Math.Sin(i * 2 * Math.PI / pointCount+ cnt);

dataCos[i] = Math.Cos(i * 2 * Math.PI / pointCount);

}

cnt++;

if (cnt == 5)

{

cnt = 0;

}

scottPlotUC1.plt.PlotScatter(dataXs, dataSin);

//scottPlotUC1.plt.PlotScatter(dataXs, dataCos);

scottPlotUC1.plt.XLabel("experiment time (ms)");

scottPlotUC1.plt.YLabel("signal (mV)");

scottPlotUC1.plt.Title("ScottPlot Quickstart");

scottPlotUC1.plt.AxisAuto();

scottPlotUC1.Render();

}

}

}

标签: c# wpf 开发语言

本文转载自: https://blog.csdn.net/lbaihao/article/details/129639439
版权归原作者 lbaihao 所有, 如有侵权,请联系我们删除。

“C# Scott Plot 开源图标组件”的评论:

还没有评论