ScottPlot 绘图教程-C# Winform版

ScottPlot 绘图教程-C# Winform版

编码文章call10242025-07-15 21:12:545A+A-

简介

我们经常要在 WinForm 窗体应用程序中绘制波形图表,WinForm的内置图表控件比较丑且功能有限,此时我们可以寻找替代解决方案。

存在许多第三方图表工具,其中大多数是商业的,需要花钱买版权才能使用。而有一些则是免费且又比较好用的,最有名气的当属Scott Plot。本教程将使用ScottPlot,这是一个适用于.NET的免费开源绘图库。

ScottPlot入门

使用ScottPlot 绘图的基本操作步骤如下:

  • 步骤1:安装ScottPlot.WinForms NuGet 包(需注意项目依赖的.NET Framework版本);
  • 步骤2:将“FormsPlot”从“工具箱”拖拽至WinForm窗体中;
  • 步骤3:编写代码,可参照如下图所示的基础样例。

简单样例:

using ScottPlot;
using System;
using System.Windows.Forms;

namespace ScottPlotDemo1_WinForm
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            CreateChart();
        }

        private void CreateChart()
        {
            double[] dataX = new double[] { 1, 2, 3, 4, 5 };
            double[] dataY = new double[] { 1, 4, 9, 16, 25 };
            formsPlot1.Plot.AddScatter(dataX, dataY);
            formsPlot1.Refresh();
        }
    }
}

运行效果:

还可以在图表控件中增加X轴标签、Y轴标签、图表标题等,示例如下

            formsPlot1.Plot.XLabel("时间[s]");
            formsPlot1.Plot.YLabel("温度[°C]");
            formsPlot1.Plot.Title("温度传感器");
            formsPlot1.Refresh();


单点实时绘图

通常,我们希望实时更新绘图,比如从温度传感器获取逐个的获取数据后实时更新温度曲线等。在下面的示例中,将使用C# 内置的随机函数用于每秒使用新值更新绘图:

using System;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;

namespace ScottPlotDemo_WinForm
{
    public partial class Form1 : Form
    {
        double[] dataX = new double[0];
        double[] dataY = new double[0];
        int k = 0;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            InitializeChart();

            timer1.Interval = 1000;
            timer1.Start();
        }

        private void InitializeChart()
        {
            formsPlot1.Plot.XLabel("时间[s]");
            formsPlot1.Plot.YLabel("温度[°C]");
            formsPlot1.Plot.Title("温度传感器");
            formsPlot1.Refresh();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            UpdateChart();
        }

        private void UpdateChart()
        {
            k++;
            double newValue = GetSensorData();
            dataX = dataX.Append(k).ToArray();
            dataY = dataY.Append(newValue).ToArray();
            formsPlot1.Plot.AddScatter(dataX, dataY, color: Color.Orange);
            formsPlot1.Plot.AxisAuto();
            formsPlot1.Render();
        }

        private double GetSensorData()
        {
            Random rand = new Random();
            double sensorValue = rand.NextDouble() * 10 + 20; //Random Value between 20 and 30
            return sensorValue;
        }
    }
}

注意此处使用了定时器来以特定的时间间隔更新数据,在末尾使用 AxisAuto()Render()方法,以确保图表已成功更新。

程序运行效果如下图所示:

点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4