ScottPlot入门教程:获取和显示鼠标处的数值

1效果展示

ScottPlot是个非常不错的开源图表库,官方的例程也比较丰富,本文简单举例说明如何获取鼠标处的数值,和官方示例ShowValueOnHover2类似。

2创建Demo工程

创建空白的Winform桌面程序

 引入ScottPlot库

右键解决方案,点击Nuget程序包管理,搜索完整名ScottPlot:

 引入完成之后设计窗口的工具箱中会出现FromsPlot控件,将其拖放到设计界面中,这里再加两个控件:

Button用于点击产生随机数据,Label用于显示鼠标位置的数值,初始位置随意,程序里我们让它跟随鼠标在适当的位置显示。

 图中更改了Label的背景色和边框样式,这样看起来好看些。

 3代码编辑

双击添加的刷新Button可快速添加监听并进入代码编辑模式。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ScottPlotTest
{
    public partial class Form1 : Form
    {
        public const int MAX_LOG_LENGHT = 1000;

        private double[] values = new double[MAX_LOG_LENGHT];
        private int dataCnt = 0;
        private ScottPlot.Plottable.SignalPlot signalPlot;
        public Form1()
        {
            InitializeComponent();

            /*
             * 1.设置数据源,自定义X轴标签
             */
            var plt = formsPlot1.Plot;
            plt.Title("实时曲线");
            plt.SetAxisLimitsY(0, 1600);
            plt.SetAxisLimitsX(0, 20);
            signalPlot = plt.AddSignal(values);
            signalPlot.MaxRenderIndex = dataCnt;
            //生成X轴标签
            double[] labelPositions = new double[MAX_LOG_LENGHT];
            string[] labelsXAxis = new string[MAX_LOG_LENGHT];
            for (int i = 0; i < MAX_LOG_LENGHT; i++)
            {
                labelsXAxis[i] = i.ToString();
                labelPositions[i] = i;
            }
            plt.XTicks(labelPositions, labelsXAxis);
            formsPlot1.Refresh();

            //鼠标移动监听
            formsPlot1.MouseMove += FormsPlot1_MouseMove;
        }

        protected override void OnSizeChanged(EventArgs e)
        {
            base.OnSizeChanged(e);
            /*
             * 2.自动适应窗口大小
             */
            formsPlot1.Location = new Point(12, 51);
            formsPlot1.Width = Size.Width - 48;
            formsPlot1.Height = Size.Height - 108;
        }

        private void FormsPlot1_MouseMove(object sender, MouseEventArgs e)
        {
            /*
             * 3.计算鼠标处的值并通过Label显示
             */
            label1.Visible = false;
            Point mouseLocation = e.Location;
            double xCoordinate = formsPlot1.Plot.GetCoordinateX(mouseLocation.X);
            int xAxis = Math.Abs((int)Math.Round(xCoordinate));
            if (xAxis < dataCnt)
            {
                int y = (int)formsPlot1.Plot.GetPixelY(values[xAxis]);
                if (Math.Abs(mouseLocation.Y - y) < 16)
                {
                    label1.Text = "Y:" + y.ToString()
                        + "\nX:" + xAxis.ToString();
                    //调整label到合适位置
                    mouseLocation.Y += label1.Height;
                    mouseLocation.X += 16;
                    label1.Location = mouseLocation;
                    label1.Visible = true;
                }
            }
        }

        private void Button1_Click(object sender, EventArgs e)
        {
            /*
             * 4.生成随机数据
             */
            GetData();
            formsPlot1.Plot.AxisAuto();
            formsPlot1.Refresh();
        }

        private void GetData()
        {
            Random rand = new Random();
            values[dataCnt] = 1000 + rand.Next(-100, 100);
            signalPlot.MaxRenderIndex = dataCnt;
            dataCnt++;
            if(MAX_LOG_LENGHT == dataCnt)
            {
                dataCnt = 0;
            }
        }
    }
}

代码做了4件事:

1.设置数据源;自定义X轴标签,只显示整数。

2.自动适应窗口大小。

3.计算鼠标处的值并通过Label显示。

4.生成随机数据。

我们重点看如何获取鼠标处的值,通过GetCoordinateX()获取X轴鼠标像素点对应的图标曲线坐标的值,然后取最近的整数,这个数就是数据的索引,这里就得到了X-Y对的值。但我们需要鼠标指到数据点附近时才显示,所以接下来通过GetPixelY()获取Y轴坐标数值对应的像素值,在距离16个像素范围内就显示Label,否则就不显示。

 4官方的示例

官方Demo的ShowValueOnHover2即是显示鼠标处数值示例,源码如下:

private void formsPlot1_MouseMove(object sender, MouseEventArgs e)
{
	// determine point nearest the cursor
	(double mouseCoordX, double mouseCoordY) = formsPlot1.GetMouseCoordinates();
	double xyRatio = formsPlot1.Plot.XAxis.Dims.PxPerUnit / formsPlot1.Plot.YAxis.Dims.PxPerUnit;
	(double pointX, double pointY, int pointIndex) = MyScatterPlot.GetPointNearest(mouseCoordX, mouseCoordY, xyRatio);

	// place the highlight over the point of interest
	HighlightedPoint.X = pointX;
	HighlightedPoint.Y = pointY;
	HighlightedPoint.IsVisible = true;

	// render if the highlighted point chnaged
	if (LastHighlightedIndex != pointIndex)
	{
		LastHighlightedIndex = pointIndex;
		formsPlot1.Refresh();
	}

	// update the GUI to describe the highlighted point
	label1.Text = $"Closest point to ({e.X:N0}, {e.Y:N0}) " +
		$"is index {pointIndex} ({pointX:N2}, {pointY:N2})";
}

效果图:

 

 5END

  • 8
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值