使用ScottPlot库在.NET WinForms中快速实现大型数据集的交互式显示

简介: 使用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支持💖。

优秀项目和框架精选

该项目已收录到C#/.NET/.NET Core优秀项目和框架精选中,关注优秀项目和框架精选能让你及时了解C#、.NET和.NET Core领域的最新动态和最佳实践,提高开发工作效率和质量。坑已挖,欢迎大家踊跃提交PR推荐或自荐(让优秀的项目和框架不被埋没🤞)。

相关文章
|
14天前
|
C#
一个.NET开源、轻量级的运行耗时统计库 - MethodTimer
一个.NET开源、轻量级的运行耗时统计库 - MethodTimer
|
14天前
|
人工智能 自然语言处理 API
适用于 .NET 稳定的官方OpenAI库
适用于 .NET 稳定的官方OpenAI库
|
19天前
|
存储 设计模式 编解码
.NET 8.0 通用管理平台,支持模块化、WinForms 和 WPF
【11月更文挑战第5天】本文分析了.NET 8.0 通用管理平台在模块化、WinForms 和 WPF 方面的优势。模块化设计提升了系统的可维护性和可扩展性,提高了代码复用性;WinForms 提供了丰富的控件库和简单易用的开发模式,技术成熟稳定;WPF 支持强大的数据绑定和 MVVM 模式,具备丰富的图形和动画功能,以及灵活的布局系统。
|
2月前
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
Android远程连接和登录FTPS服务代码(commons.net库)
24 1
|
14天前
|
开发框架 安全 .NET
.NET使用Moq开源模拟库简化单元测试
.NET使用Moq开源模拟库简化单元测试~
|
2月前
|
网络协议 Unix Linux
一个.NET开源、快速、低延迟的异步套接字服务器和客户端库
一个.NET开源、快速、低延迟的异步套接字服务器和客户端库
|
2月前
|
存储 消息中间件 NoSQL
Redis 入门 - C#.NET Core客户端库六种选择
Redis 入门 - C#.NET Core客户端库六种选择
63 8
|
2月前
|
存储 开发框架 .NET
.NET 8 实现无实体库表 API 部署服务
【10月更文挑战第12天】在.NET 8中,可通过以下步骤实现无实体库表的API部署:首先安装.NET 8 SDK及开发工具,并选用轻量级Web API框架如ASP.NET Core;接着创建新项目并设计API,利用内存数据结构模拟数据存储;最后配置项目设置并进行测试与部署。此方法适用于小型项目或临时解决方案,但对于大规模应用仍需考虑持久化存储以确保数据可靠性与可扩展性。
|
2月前
|
开发者 Windows
.NET 开源扁平化、美观的 C/S 控件库
【10月更文挑战第23天】介绍了三款适用于 .NET 平台的开源扁平化、美观的 C/S 控件库:MaterialSkin 采用 Google Material Design 风格,适合现代感界面;Krypton Toolkit 提供丰富控件,界面易于定制;Fluent Ribbon Control Suite 模仿 Office 界面,适合复杂功能应用。每款控件库均附有示例代码及 GitHub 链接。
|
4月前
|
Unix Linux C#
增强用户体验:2个功能强大的.NET控制台应用帮助库
增强用户体验:2个功能强大的.NET控制台应用帮助库