使用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推薦或自薦(讓優秀的項目和框架不被埋沒🤞)。

DotNetGuide技術社區交流羣

  • DotNetGuide技術社區是一個面向.NET開發者的開源技術社區,旨在爲開發者們提供全面的C#/.NET/.NET Core相關學習資料、技術分享和諮詢、項目推薦、招聘資訊和解決問題的平臺。
  • 在這個社區中,開發者們可以分享自己的技術文章、項目經驗、遇到的疑難技術問題以及解決方案,並且還有機會結識志同道合的開發者。
  • 我們致力於構建一個積極向上、和諧友善的.NET技術交流平臺,爲廣大.NET開發者帶來更多的價值和成長機會。

歡迎加入DotNetGuide技術社區微信交流羣👪

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章