使用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推荐或自荐(让优秀的项目和框架不被埋没🤞)。

  • https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.md

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/537104.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[剪藏] - 由哇哈哈和农夫山泉所想到的

哇哈哈和农夫山泉的缠斗最近冒出来一个有趣的点&#xff1a;营销大于内容的胜利。 具体来说是这样的&#xff1a;农夫山泉很多年前做广告&#xff0c;说纯净水没有矿物质&#xff0c;长期喝是不利于人体健康的。农夫还做了个营销的对比实验&#xff0c;大概是用矿泉水养水仙花&…

ASFF自适应空间特征融合

paper&#xff1a;Learning Spatial Fusion for Single-Shot Object Detection official implementation&#xff1a;https://github.com/GOATmessi7/ASFF 背景 金字塔特征表示pyramid feature representation是解决目标检测中尺度变化挑战的常用方法。特征金字塔的一个主要…

刷题日记——反转公约数、循环位移(厦门大学机试)

题目 分析 将输入的数字看作字符串&#xff0c;然后将字符串转成真实值计算两个真实值&#xff0c;然后从1开始遍历公约数&#xff0c;每次发现一个更大的公约数就替换&#xff0c;直到找不到公约数 代码 #include <cstdio> #include <map> #include <string…

Spring Boot整合canal实现数据一致性解决方案解析-部署+实战

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 1.前言 2.canal部署安装 3.Spring Boot整合canal 3.1数据库与缓存一致性问题…

内存操作函数

memcpy mem--memory--内存 指向计算机内存 cpy-copy-拷贝 也就是内存拷贝 针对内存的函数 void* memcpy(void * destination,const void * source,size_t num) 把source的空间 复制到 destination的部分 长度是num 如果source 和 dest 的部分有重叠,会复制的结果是未定义的(建…

memcpy函数及其模拟实现

一、 函数原型 void *memcpy(void *destin, void *source, size_t n);二、参数 destin-- 指向用于存储复制内容的目标数组&#xff0c;类型强制转换为 void* 指针。 source-- 指向要复制的数据源&#xff0c;类型强制转换为 void* 指针。 n-- 要被复制的字节数。 三、返回…

软考高级:信息系统开发方法2(形式化方法、统计过程方法等)概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

Prometheus 安装部署

文章目录 1.部署Prometheus1.1.修改配置文件1.2.配置告警规则1.3.运行Docker 2.部署Alertmanager2.1.修改配置文件2.2.Prometheus监控配置2.3.运行Docker 3.部署Grafana3.1.运行Docker3.2. 配置数据源3.3. 配置dashboard 开源中间件 # Prometheushttps://iothub.org.cn/docs/m…

linux paddle For C++环境搭建

paddle介绍 Paddle是类似tesseract的文字识别ocr。因为tesseract-ocr的中文识别效果不好。因此才准备安装Paddle。Paddle最方便的安装方式的使用Python的包管理安装。pip3 install paddlepaddle。但我使用了一下感觉还是用C更加方便&#xff0c;QT OpenCV Paddle应当还不错。…

哈密顿算子的计算公式及一些常用公式总结

目录 哈密顿算子的定义式如下&#xff1a; 梯度定义&#xff1a; 散度定义&#xff1a; 旋度定义&#xff1a; 常用的一些公式&#xff1a; 注意文中字母上面没有→的是标量&#xff0c;有→的都表示矢量 哈密顿算子的定义式如下&#xff1a; 快速了解哈密顿算符&#xff…

华为组网:核心交换机旁挂防火墙,基于ACL重定向配置实验

如图所示&#xff0c;由于业务需要&#xff0c;用户有访问Internet的需求。 用户通过接入层交换机SwitchB和核心层交换机SwitchA以及接入网关Router与Internet进行通信。为了保证数据和网络的安全性&#xff0c;用户希望保证Internet到服务器全部流量的安全性&#xff0c;配置重…

基于LIO-SAM 算法的三维激光SLAM 建图

运行环境 Linux&#xff1a;Ubuntu18.04ros&#xff1a;MelodicCeres Solver 2.0.0&#xff08;Ubuntu18.04安装Ceres&#xff09;PCL 1.8.1&#xff08;Ubuntu系统的PCL、Eigen卸载和安装&#xff09;gtsam-4.0.0-alpha2 或者 4.0.2 1 背景介绍 在自动驾驶的感知方案中&…