使用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.mzph.cn/news/743409.shtml

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

相关文章

C语言snprintf():将格式化字符串输出到数组中

snprintf() 是 C语言的一个标准库函数&#xff0c;定义在<stdio.h>头文件中。 snprintf() 函数的功能是格式化字符串&#xff0c;并将结果存储在指定的字符数组中。该函数的原型如下&#xff1a; int snprintf(char *str, size_t size, const char *format[,argument...…

websocket逆向案例

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、案例地址二、分析流程三、逆向参数四、webSocket 交互位置总结 前言 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供…

OPPO后端二面,凉了!

这篇文章的问题来源于一个读者之前分享的 OPPO 后端凉经&#xff0c;我对比较典型的一些问题进行了分类并给出了详细的参考答案。希望能对正在参加面试的朋友们能够有点帮助&#xff01; Java String 为什么是不可变的? public final class String implements java.io.Seri…

Python: for,while循环语句

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; While循环 while循环用于在给定条件为真时重复执行一段代码。它会一直执行循环体内的代码&#xff0c;直到条件不再为真。这种循环特别适合于你…

‘UnityEngine.Application‘ does not contain a definition for isBatchMode

unity 2017.4.37f1. 解决办法: Try to replace Application.isBatchMode with UnityEditorInternal.InternalEditorUtility.inBatchMode

AUTOSAR汽车电子嵌入式编程精讲300篇-汽车CAN总线中的 信息安全与通信协议(续)

目录 4 基于AES算法的CAN总线加密通信 4.1 CAN总线加密通信流程设计 4.2 AES算法 4.2.1 算法实现

前端实现读取word文件,并将其进行原样式展示的几种方案

在前端直接读取并原样展示Word文档是一个相对复杂的任务&#xff0c;因为Word文档的格式&#xff08;如.doc或.docx&#xff09;与Web技术栈使用的格式&#xff08;HTML、CSS&#xff09;不兼容。要实现这一功能&#xff0c;通常需要将Word文档转换为Web友好的格式。以下是实现…

Ps:拾色器

在 Adobe 拾色器中&#xff0c;可以使用四种颜色模型来设置颜色&#xff1a;HSB、RGB、Lab 和 CMYK。 使用“拾色器”对话框可以设置前景色、背景色、填充颜色、文本颜色及专色等的颜色值。 ◆ ◆ ◆ 常用操作方法与技巧 1、注意观察“拾色器”对话框标题栏中括号里的内容&am…

交换排序实现

文章目录 冒泡排序快速排序快排的优化单次快排的其他方案快排的非递归实现 冒泡排序 冒泡排序&#xff0c;Bubble sort,通过重复遍历要排序的数列&#xff0c;比较每一对相邻元素&#xff0c;并在顺序错误时交换它们。这个过程一直重复&#xff0c;直到没有需要交换的相邻元素为…

动态规划 Leetcode 1049 最后一块石头的重量

最后一块石头的重量 Leetcode 1049 学习记录自代码随想录 要点&#xff1a;1.想到求最后剩下石头的重量可以转化为求石头组合重量最接近石头重量总和的一半和此时剩下石头重量的差值&#xff0c;从而联想到Leetcode 416此题便可以相同套路求解 class Solution { public:int…

Kafka MQ 生产者

Kafka MQ 生产者 生产者概览 尽管生产者 API 使用起来很简单&#xff0c;但消息的发送过程还是有点复杂的。图 3-1 展示了向 Kafka 发送消息的主要步骤。 我们从创建一个 ProducerRecord 对象开始&#xff0c;ProducerRecord 对象需要包含目标主题和要发送的内容。我们还可以…

windows ffmpeg 编译环境搭建

编译ffmpeg https://www.msys2.org/ https://www.ffmpeg.org/platform.html#Microsoft-Visual-C_002b_002b-or-Intel-C_002b_002b-Compiler-for-Windows 1.安装msys2 2.安装yasm或者nasm 打开VC 本地环境命令行 唤醒msys2界面 配置编译环境变量参数 export PATH"/d/vs…

Dynamo处理Excel——调用Microsoft.Office.Interop.Excel教程

你好&#xff0c;这里是BIM的乐趣&#xff0c;我是九哥~ 今天我们来聊聊如何通过Dynamo处理Excel数据以及格式&#xff0c;Dynamo自带的节点肯定是不行&#xff0c;所以我们需要来用Python解决&#xff08;当然有个节点包 Bumblebee&#xff0c;我在案例百解教程里有过介绍&a…

c++虚函数表学习

1 基础和示例1 每个包含了虚函数的类都包含一个虚表,类中只要有虚函数,就会有一个虚表来维护。 虚表是属于类的,而不是属于某个具体的对象;同一个类的所有对象都使用同一个虚表。 虚表是一个指针数组,其元素是虚函数的指针,每个元素对应一个虚函数的函数指针; 普通的函…

如何实现sam(Segment Anything Model)|fastsam模型

sam是2023年提出的一个在图像分割领域的大模型&#xff0c;其具备了对任意现实数据的分割能力&#xff0c;其论文的介绍可以参考 https://hpg123.blog.csdn.net/article/details/131137939&#xff0c;sam的亮点在于提出一种工作模式&#xff0c;同时将多形式的prompt集成到了语…

Spring核心接口:ObjectProvider接口

ObjectProvider 是 Spring Framework 5.0 中引入的一个接口&#xff0c;用于提供对 bean 的延迟访问。它可以用于在需要延迟获取 bean 或在需要对 bean 进行多次访问时&#xff0c;减少 bean 的创建次数和提高应用程序性能。ObjectProvider 接口有两个主要方法&#xff1a;getO…

短剧在线搜索源码(全网首发)

一个非常哇塞的在线短剧搜索页面&#xff0c;接口已经对接好了&#xff0c;上传源码到服务器解压就能直接用&#xff0c;有能力的可以自己改接口自己写自己的接口 接口文档地址&#xff1a;doc.djcat.sbs 源码下载地址&#xff1a;https://pan.xunlei.com/s/VNstN8C6N3VK1a1k…

使用Docker在windows上安装IBM MQ

第一步、安装wsl 详见我另一篇安装wsl文章。 第二步、安装centos 这里推荐两种方式&#xff0c;一种是从微软商城安装&#xff0c;一种是使用提前准备好的镜像安装&#xff0c;详见我另一篇windos下安装centos教程。 第三步、安装windows下的Docker desktop 详见我另一篇wind…

【牛客】HJ62 查找输入整数二进制中1的个数

题目链接&#xff1a;查找输入整数二进制中1的个数_牛客题霸_牛客网 (nowcoder.com) 解题思路&#xff1a; 解法一: 可以举一个八位的二进制例子来进行分析&#xff0c;对于二进制操作&#xff0c;我们直到&#xff0c;除以一个2&#xff0c;原来的数字会减少一个0.如果除的过程…

分布式ID(8):分布式ID生成方法

在分布式系统中,生成唯一的ID是一个核心问题,特别是在需要确保数据完整性和避免冲突的场景中。以下是对五种分布式唯一ID生成方法的详细阐述,包括它们的工作原理、优缺点,以及对网络依赖性的考量: 1 UUID(通用唯一标识符) 实现原理 工作方式:UUID是通过一系列算法生成…