使用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開發者帶來更多的價值和成長機會。
作者名稱:追逐時光者
作者簡介:一個熱愛編程、善于分享、喜歡學習、探索、嘗試新事物和新技術的全棧軟件工程師。
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,否則保留追究法律責任的權利。如果該篇文章對您有幫助的話,可以點一下右下角的【♥推薦♥】,希望能夠持續的為大家帶來好的技術文章,文中可能存在描述不正確的地方,歡迎指正或補充,不勝感激。