如何在.NET WinForms中用ScottPlot快速展示海量数据集的交互式图表?
摘要:前言 在.NET应用开发中数据集的交互式显示是一个非常常见的功能,如需要创建折线图、柱状图、饼图、散点图等不同类型的图表将数据呈现出来,帮助人们更好地理解数据、发现规律,并支持决策和沟通。本文我们将一起来学习一下如何使用ScottPlot库
前言
在.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)从工具箱拖到窗体中:
输入以下代码:
publicpartialclassLineChart:Form
{
publicLineChart()
{
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();
}
publicdouble[]GetRandomNum(intlength)
{
double[]getDate=newdouble[length];
Randomrandom=newRandom();//创建一个Random实例
for(inti=0;i<length;i++)
{
getDate[i]=random.Next(1,100);//使用同一个Random实例生成随机数
}
returngetDate;
}
}
运行效果展示:
柱状图实现
创建名为:BarChart窗体。
将FormsPlot (ScottPlot.WinForms)从工具箱拖到窗体中:
输入以下代码:
publicpartialclassBarChart:Form
{
publicBarChart()
{
double[]values={5,10,7,13,22,18,33,16};
formsPlot1.Plot.Add.Bars(values);
formsPlot1.Refresh();
}
}
运行效果展示:
饼图实现
创建名为:PieChart窗体。
将FormsPlot (ScottPlot.WinForms)从工具箱拖到窗体中:
输入以下代码:
publicpartialclassPieChart:Form
{
publicPieChart()
{
double[]values={3,2,8,4,8,10};
formsPlot1.Plot.Add.Pie(values);
formsPlot1.Refresh();
}
}
运行效果展示:
散点图实现
创建名为:ScatterChart窗体。
将FormsPlot (ScottPlot.WinForms)从工具箱拖到窗体中:
输入以下代码:
publicpartialclassScatterChart:Form
{
publicScatterChart()
{
//从原始数据开始
double[]xs=Generate.Consecutive(100);
double[]ys=Generate.NoisyExponential(100);
//对数据进行对数缩放,并处理负值
double[]logYs=ys.Select(Math.Log10).ToArray();
//将对数缩放的数据添加到绘图中
varsp=formsPlot1.Plot.Add.Scatter(xs,logYs);
sp.LineWidth=0;
//创建一个次要刻度生成器,用于放置对数分布的次要刻度
ScottPlot.TickGenerators.LogMinorTickGeneratorminorTickGen=new();
//创建一个数值刻度生成器,使用自定义的次要刻度生成器
ScottPlot.TickGenerators.NumericAutomatictickGen=new();
tickGen.MinorTickGenerator=minorTickGen;
//创建一个自定义刻度格式化程序,用于设置每个刻度的标签文本
staticstringLogTickLabelFormatter(doubley)=>$"{Math.Pow(10,y):N0}";
//告诉我们的主要刻度生成器仅显示整数的主要刻度
tickGen.IntegerTicksOnly=true;
//告诉我们的自定义刻度生成器使用新的标签格式化程序
tickGen.LabelFormatter=LogTickLabelFormatter;
//告诉左轴使用我们的自定义刻度生成器
formsPlot1.Plot.Axes.Left.TickGenerator=tickGen;
//显示次要刻度的网格线
vargrid=formsPlot1.Plot.GetDefaultGrid();
grid.MajorLineStyle.Color=Colors.Black.WithOpacity(.15);
grid.MinorLineStyle.Color=Colors.Black.WithOpacity(.05);
grid.MinorLineStyle.Width=1;
formsPlot1.Refresh();
}
}
运行效果展示:
项目演示入口
privatevoidBtn_ScatterChart_Click(objectsender,EventArgse)
{
ScatterChartformScatterChart=newScatterChart();
//显示目标窗体
formScatterChart.Show();
}
privatevoidBtn_PieChart_Click(objectsender,EventArgse)
{
PieChartformPieChart=newPieChart();
//显示目标窗体
formPieChart.Show();
}
privatevoidBtn_BarChart_Click(objectsender,EventArgse)
{
BarChartformbarChart=newBarChart();
//显示目标窗体
formbarChart.Show();
}
privatevoidBtn_LineChart_Click(objectsender,EventArgse)
{
LineChartformLineChart=newLineChart();
//显示目标窗体
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
DotNetGuide技术社区交流群
DotNetGuide技术社区是一个面向.NET开发者的开源技术社区,旨在为开发者们提供全面的C#/.NET/.NET Core相关学习资料、技术分享和咨询、项目推荐、招聘资讯和解决问题的平台。
在这个社区中,开发者们可以分享自己的技术文章、项目经验、遇到的疑难技术问题以及解决方案,并且还有机会结识志同道合的开发者。
我们致力于构建一个积极向上、和谐友善的.NET技术交流平台,为广大.NET开发者带来更多的价值和成长机会。
欢迎加入DotNetGuide技术社区微信交流群👪
