使用ScottPlot库在.NET WinForms中快速实现大型数据集的交互式显示
前言
在.NET应用开发中数据集的交互式显示是一个非常常见的功能,如需要创建折线图、柱状图、饼图、散点图等不同类型的图表将数据呈现出来,帮助人们更好地理解数据、发现规律,并支持决策和沟通。本文我们将一起来学习一下如何使用ScottPlot库在.NET WinForms中快速实现大型数据集的交互式显示。
ScottPlot类库介绍
ScottPlot是一个免费、开源(采用MIT许可证)的强大.NET交互式绘图库,能够轻松地实现大型数据集的交互式显示。使用几行代码即可快速创建折线图、柱状图、饼图、散点图等不同类型的图表。
ScottPlot类库支持平台和框架
Console Application、WinForms、WPF、Avalonia、Blazor、WinUI等多个平台和框架。
ScottPlot类库源代码

新建WinForms项目
新建一个名为ScottPlotWinFormsExercise的项目。




安装ScottPlot.WinForms包
搜索ScottPlot.WinForms包安装:

折线图实现
创建名为:LineChart窗体。


将FormsPlot (ScottPlot.WinForms)从工具箱拖到窗体中:

输入以下代码:
public partial class LineChart : Form
{
public LineChart()
{
double[] dataX = GetRandomNum(20).Distinct().OrderByDescending(x => x).ToArray();
double[] dataY = GetRandomNum(19).Distinct().OrderByDescending(x => x).ToArray();
formsPlot1.Plot.Add.Scatter(dataX, dataY);
formsPlot1.Refresh();
}
public double[] GetRandomNum(int length)
{
double[] getDate = new double[length];
Random random = new Random(); //创建一个Random实例
for (int i = 0; i < length; i++)
{
getDate[i] = random.Next(1, 100); //使用同一个Random实例生成随机数
}
return getDate;
}
}
运行效果展示:

柱状图实现
创建名为:BarChart窗体。

将FormsPlot (ScottPlot.WinForms)从工具箱拖到窗体中:

输入以下代码:
public partial class BarChart : Form
{
public BarChart()
{
double[] values = { 5, 10, 7, 13, 22, 18, 33, 16 };
formsPlot1.Plot.Add.Bars(values);
formsPlot1.Refresh();
}
}
运行效果展示:

饼图实现
创建名为:PieChart窗体。

将FormsPlot (ScottPlot.WinForms)从工具箱拖到窗体中:

输入以下代码:
public partial class PieChart : Form
{
public PieChart()
{
double[] values = { 3, 2, 8, 4, 8, 10 };
formsPlot1.Plot.Add.Pie(values);
formsPlot1.Refresh();
}
}
运行效果展示:

散点图实现
创建名为:ScatterChart窗体。

将FormsPlot (ScottPlot.WinForms)从工具箱拖到窗体中:

输入以下代码:
public partial class ScatterChart : Form
{
public ScatterChart()
{
//从原始数据开始
double[] xs = Generate.Consecutive(100);
double[] ys = Generate.NoisyExponential(100);
//对数据进行对数缩放,并处理负值
double[] logYs = ys.Select(Math.Log10).ToArray();
//将对数缩放的数据添加到绘图中
var sp = formsPlot1.Plot.Add.Scatter(xs, logYs);
sp.LineWidth = 0;
//创建一个次要刻度生成器,用于放置对数分布的次要刻度
ScottPlot.TickGenerators.LogMinorTickGenerator minorTickGen = new();
//创建一个数值刻度生成器,使用自定义的次要刻度生成器
ScottPlot.TickGenerators.NumericAutomatic tickGen = new();
tickGen.MinorTickGenerator = minorTickGen;
//创建一个自定义刻度格式化程序,用于设置每个刻度的标签文本
static string LogTickLabelFormatter(double y) => $"{Math.Pow(10, y):N0}";
//告诉我们的主要刻度生成器仅显示整数的主要刻度
tickGen.IntegerTicksOnly = true;
//告诉我们的自定义刻度生成器使用新的标签格式化程序
tickGen.LabelFormatter = LogTickLabelFormatter;
//告诉左轴使用我们的自定义刻度生成器
formsPlot1.Plot.Axes.Left.TickGenerator = tickGen;
//显示次要刻度的网格线
var grid = formsPlot1.Plot.GetDefaultGrid();
grid.MajorLineStyle.Color = Colors.Black.WithOpacity(.15);
grid.MinorLineStyle.Color = Colors.Black.WithOpacity(.05);
grid.MinorLineStyle.Width = 1;
formsPlot1.Refresh();
}
}
运行效果展示:

项目演示入口

private void Btn_ScatterChart_Click(object sender, EventArgs e)
{
ScatterChart formScatterChart = new ScatterChart();
// 显示目标窗体
formScatterChart.Show();
}
private void Btn_PieChart_Click(object sender, EventArgs e)
{
PieChart formPieChart = new PieChart();
// 显示目标窗体
formPieChart.Show();
}
private void Btn_BarChart_Click(object sender, EventArgs e)
{
BarChart formbarChart = new BarChart();
// 显示目标窗体
formbarChart.Show();
}
private void Btn_LineChart_Click(object sender, EventArgs e)
{
LineChart formLineChart = new LineChart();
// 显示目标窗体
formLineChart.Show();
}
项目源码地址
更多项目实用功能和特性欢迎前往项目开源地址查看,别忘了给项目一个Star支持。
- GitHub开源地址:https://github.com/ScottPlot/ScottPlot
- 在线文档地址:https://scottplot.net/cookbook/5.0/
- ScottPlotWinFormsExercise:https://github.com/YSGStudyHards/DotNetExercises
优秀项目和框架精选
该项目已收录到C#/.NET/.NET Core优秀项目和框架精选中,关注优秀项目和框架精选能让你及时了解C#、.NET和.NET Core领域的最新动态和最佳实践,提高开发工作效率和质量。坑已挖,欢迎大家踊跃提交PR推荐或自荐(让优秀的项目和框架不被埋没)。
DotNetGuide技术社区交流群
- DotNetGuide技术社区是一个面向.NET开发者的开源技术社区,旨在为开发者们提供全面的C#/.NET/.NET Core相关学习资料、技术分享和咨询、项目推荐、招聘资讯和解决问题的平台。
- 在这个社区中,开发者们可以分享自己的技术文章、项目经验、遇到的疑难技术问题以及解决方案,并且还有机会结识志同道合的开发者。
- 我们致力于构建一个积极向上、和谐友善的.NET技术交流平台,为广大.NET开发者带来更多的价值和成长机会。
使用ScottPlot库在.NET WinForms中快速实现大型数据集的交互式显示的更多相关文章
- MWeb for Mac使用教程-如何在文档库中快速搜索
使用MWeb for Mac专业的 Markdown 编辑写作软件,可以让你随时记录自己的想法,灵感,创意,为您的工作节省宝贵的时间.本篇文章带来的是MWeb for Mac如何在文档库中快速搜索使用 ...
- 开源框架】Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发
[原][开源框架]Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发,欢迎各位... 时间 2015-01-05 10:08:18 我是程序猿,我为自己代言 原文 http: ...
- MFC中快速应用OpenCV(转)
转载链接:http://wiki.opencv.org.cn/index.php/MFC%E4%B8%AD%E5%BF%AB%E9%80%9F%E5%BA%94%E7%94%A8OpenCV 简介和缘 ...
- linux中快速清空文件内容的几种方法
这篇文章主要介绍了linux中快速清空文件内容的几种方法,需要的朋友可以参考下 $ : > filename $ > filename $ echo "" > f ...
- MySQL中快速复制数据表方法汇总
本文将着重介绍两个MySQL命令的组合,它将以原有数据表为基础,创建相同结构和数据的新数据表. 这可以帮助你在开发过程中快速的复制表格作为测试数据,而不必冒险直接操作正在运行 的数据表. 示例如下: ...
- extractCSS – 帮助你从 HTML 中快速分离出 CSS
extractCSS 是一个免费的基于 Web 的应用程序,能够从 HTML 中提取风格相关的信息,包括 id.class 和内联样式,而且输出可以定制(缩进和括号的用法).该工具非常有用,当我们快速 ...
- 在WPF的DATAGRID中快速点击出现在ADDNEW或EDITITEM事务过程不允许DEFERREFRESH
原文 在WPF的DATAGRID中快速点击出现在ADDNEW或EDITITEM事务过程不允许DEFERREFRESH 在项目中关于DataGrid的遇到过一些问题,其中是关于迁入CheckBox的双向 ...
- Castle Windsor 项目中快速使用
Castle Windsor 项目中快速使用 新建项目如下: 一个模型类,一个接口,一个实现方法.我的目的很明确就是在UI层通过Castle 调用数据访问层的方法. 添加项目引用 CastleDemo ...
- 表格布局扩展/DW设计界面中快速整体布局页面的操作
DW设计界面中快速整体布局页面的操作流程: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &q ...
- 在eclispe的类中快速打出main方法
在java类中快速打出main方法有两种途径: 1. 在新建类时,在New Java Class窗口中,将public static void main ( String[ ] args ) 前面打上 ...
随机推荐
- LyScript 批量搜索反汇编特征
LyScript 插件实现对特定汇编指令片段的批量搜索功能,用户传入一个汇编指令列表,然后循环搜索该列表内的所有指令特征,如果找到了,则返回该指令的内存地址. 插件地址:https://github. ...
- 顺颂秋冬<一>
起名字真难. 原来想给这个合集起个积极的名字,记录鄙人浅薄的认知和内心的荒芜. 以及所遇见的温暖. 想来想去,不过是 浮生旧茶 西楼残月之类的 难堪大用. 后来想起来一句, 即,顺颂时祺,秋绥冬禧, ...
- h5st 4.3版本代码研究
背景介绍 最近比较悠闲,于是没事研究了一下某东的h5st代码,2024年新鲜出炉的前端加密代码: 最大的惊喜并不是算法的复杂,在逆向破解代码的过程中,对js加密混淆有了新的认识: 于是心血来潮,回到这 ...
- Socket.D 协议的开发缘由
为什么搞个新协议? 2021年时,想为 Solon 生态 提供一种 MVC 体验的 Socket 和 WebSocket 开发方式.这个想法,要求消息"能路由"."有元信 ...
- JuiceFS v1.0 正式发布,首个面向生产环境的 LTS 版本
今天,JuiceFS v1.0 发布了 经过了 18 个月的持续迭代和大量生产环境的广泛验证,此版本将成为第一个被长期维护的稳定版(LTS).同时,该版本提供完整的向前兼容,所有用户可以直接升级. J ...
- 树莓派4B改造成云桌面客户端,连接DoraCloud免费版
Raspberry Pi(树莓派) 是为学习计算机编程教育而设计的只有信用卡大小的微型电脑,自问世以来受众多计算机发烧友和创客的追捧,曾经一"派"难求. DoraCloud是一款多 ...
- 零基础入门学习JAVA课堂笔记 ——DAY08
异常 1.什么是异常? Exception 异常是指程序在运行过程中出现的不期而至的各种状况 异常发生在程序运行期间,它影响了正常程序执行流程 通俗易懂的表达就是,程序在发生意料之外或者拿到的不是想要 ...
- ZR 七连 Day 1 游记
ZR 七连 Day 1 游记 游记篇 赛前搞笑事件 今天是第一场正睿,还是要 好好对待 的 $ 17:59:58 $ 还在吃饭 $ 17:59:59 $ 做出重要决定,先打着比赛,有空就吃一口包子 $ ...
- public private protected 的辨析
一. public 1.作为类内成员的访问修饰符时,由public修饰的成员数据或者成员函数可以在类外(即派生类内以及实例化的对象后)以及类内进行随意访问 可以看到public成员Data在类外是可访 ...
- .NET Core开发实战(第34课:MediatR:轻松实现命令查询职责分离模式(CQRS))--学习笔记(下)
34 | MediatR:轻松实现命令查询职责分离模式(CQRS) 实际上我们在定义我的查询的时候,也可以这样定义,例如我们定义一个 MyOrderQuery,把订单的所有名称都输出出去 namesp ...