C# WPF - 图表控件ScottPlot入门

文摘   科技   2023-12-10 10:00   广东  

Keep Moving 

保持·热爱

ScottPlot

WPF上位机开发

C#

图表控件入门



开源图表控件ScottPlot的学习记录

包含曲线自由移动缩放显隐

标记轴线十字准线功能

github.com/ScottPlot/ScottPlot

后台回复代码,获取下载链接



概述

概述

最近领导安排搞一个上位机,并推荐使用葡萄城的C1Chart绘制图表。零基础的我用着实属难受,文档也不友好:


搜索引擎告诉我ScottPlot是一款不错的开源控件:



开发记录

实现链表             

              链表设计

开发帮助文档

  • 文档地址:scottplot.net/cookbook/4.1/

  • 入门文档相当舒服,效果图 + 源代码进行讲解


控件安装步骤

  • 新建一个WPF的解决方案

  • 资源管理器右键解决方案,打开NuGet包管理器

  • 或者菜单栏,点击>项目,点击>NuGet程序包

  • 搜索“ScottPlot”,安装“ScottPlot”、“ScottPlot.WPF”

  • 安装失败,需右键>解决方案,选择>属性,更改目标框架为最新的“V4.7.2

  • 安装成功,工具箱会显示“WpfPlot”的控件


窗体布置WpfPlot

这里使用WPF开发,窗体使用XAML描述,与HTML设计类似,熟悉网页开发的朋友很容易上手。

下图皆是创建解决方案自动生成的代码:

先增加一个主窗体加载的事件

接着在“Grid”容器中添加如下代码:

<Grid.RowDefinitions>    <RowDefinition Height="15"/>    <RowDefinition Height="383*"/></Grid.RowDefinitions><WpfPlot Name="wpfPlot" Grid.Row="1" MouseEnter="wpfPlot_MouseEnter" MouseLeave="wpfPlot_MouseLeave" MouseMove="wpfPlot_MouseMove"/><CheckBox x:Name="plot1" Content="曲线1"  Click="plot2_Click" IsChecked="True"/><CheckBox x:Name="plot2" Content="曲线2"  Margin="80,0,0,0" Click="plot2_Click" IsChecked="True"/>
  • 放置两个CheckBox复选框,绑定一个单击事件,用于曲线的显隐

  • 放置一个WpfPlot图表控件,绑定3个鼠标事件(实现十字准线)


编辑主窗体加载的代码

加载时,即创建了两条曲线:

private void Window_Loaded(object sender, RoutedEventArgs e){  double[] X = new double[1024];  double[] Y = new double[1024];  double[] X1 = new double[1024];  double[] Y1 = new double[1024];  for (int i = 0; i < 1024; i++)  {    X[i] = i;    X1[i] = i;    Y[i] = 1.9 * Math.Sin(i * 0.01);    Y1[i] = 3 * Math.Sin(i * 0.03 + 2.5 * 3.14);  }    var plt = wpfPlot.Plot;  plt.Clear();  //先清空图表  plt.Title("标题:曲线测试");  plt.XLabel("X轴:时间ms");  plt.YLabel("Y轴:电压mV");  plt.AddScatter(X, Y, label: "曲线1");  plt.AddScatter(X1, Y1, label: "曲线2");    //曲线的图例配置  var legend = plt.Legend(true, ScottPlot.Alignment.UpperCenter);//顶部居中  legend.Orientation = ScottPlot.Orientation.Horizontal;         //横向排列  legend.FontColor = System.Drawing.Color.White;                 //白色文字  legend.FillColor = System.Drawing.Color.Transparent;           //透明  legend.OutlineColor = System.Drawing.Color.Transparent;        //透明  legend.ShadowColor = System.Drawing.Color.Transparent;         //透明  //图表背景色  plt.Style(ScottPlot.Style.Blue2);    //横向的轴线,投向Y轴  var hLine = plt.AddHorizontalLine(2);       //对应Y坐标点  hLine.DragEnabled = true;                   //使能拖动  hLine.DragLimitMin = -10;                   //位置限制  hLine.DragLimitMax = 100;  hLine.PositionLabel = true;                  //标记坐标数值  hLine.PositionLabelBackground = hLine.Color; //标记的背景色  //竖向的轴线,同上  var vLine = plt.AddVerticalLine(3);  vLine.DragEnabled = true;  vLine.DragLimitMin = -10;  vLine.DragLimitMax = 50;  vLine.PositionLabel = true;  vLine.PositionLabelBackground = vLine.Color;  //X轴线标记的数值格式,小数点后1位  Func<double, string> xFormatter = x => $"X={x:F1}";  vLine.PositionFormatter = xFormatter;    //绑定十字准线  Crosshair = plt.AddCrosshair(5, 5);  //更新图表  wpfPlot.Refresh();}


实现十字准线

利用WpfPlot的“MouseMove”事件,实现该功能:

private void wpfPlot_MouseMove(object sender, MouseEventArgs e){  ValueTuple<double, double> mouseCoordinates = this.wpfPlot.GetMouseCoordinates();  double coordinateX = mouseCoordinates.Item1;  double coordinateY = mouseCoordinates.Item2;  Crosshair.X = coordinateX;  Crosshair.Y = coordinateY;  wpfPlot.Refresh();}


搭配复选框实现曲线隐藏

根据复选框是否选中,决定曲线显示/隐藏:

private void plot2_Click(object sender, RoutedEventArgs e){ CheckBox checkbox = (CheckBox)sender; var plottables = wpfPlot.Plot.GetPlottables(); if (checkbox == plot2)  plottables[1].IsVisible = (bool)checkbox.IsChecked; else  plottables[0].IsVisible = (bool)checkbox.IsChecked; wpfPlot.Refresh();}


若绑定曲线的数据时,其返回值赋给了“series1 ”,那么通过设置series1 的IsVisible为false,即可隐藏曲线:

var series1 = plt.AddScatter(X, Y, label: "曲线1");series1.IsVisible = false;



效果演示

演示

  • 按下左键移动曲线

  • 按下右键并移动,缩放曲线

    横向移动,X轴缩放

    竖向移动,Y轴缩放

  • 滚轮等比例缩放

  • 按下滚轮移动,放大选中的曲线段


官方Demo

下载地址:https://scottplot.net/demo/

界面如下,可以当作帮助文档:





-END-


碎片聚合
求真务实
 最新文章