LiveCharts如何在winform端下生成动态曲线带不同颜色的点

LiveCharts在winform端使用的前提是需要在当前程序下通过nuget导入LiveCharts包,相应的会导入Livecharts.Winforms和LiveCharts.Wpf。这里就不在赘述,直接进入正题,如何生成动态变化曲线。

ee162d9e162f437c8a1cc6bd63e27a04.png

如上图,红色的点是我们设置的超过预设上限值的点,我们设置点为20.

我们先定义三个变量

public ChartValues<MeasureModel> ChartValues { get; set; }//用来作为图上显示的点集
        public Timer Timer { get; set; }//定时器,用来作为更新图标动态生成用
        public Random R { get; set; }//为了给Y值提供值

在当前图标窗体初始化下创建如下变量

   var alarmBrush = new SolidColorBrush(Color.FromRgb(238, 83, 80));
   var mapper = Mappers.Xy<MeasureModel>()
                .X(model => model.DateTime.Ticks)   //use DateTime.Ticks as X
                .Y(model => model.Value)
                .Fill(item => item.Value > 20 ? alarmBrush : null)

                .Stroke(item => item.Value > 20 ? alarmBrush : null)
                ;        

接着创建映射到全局和坐标轴的表示

 //lets save the mapper globally.
            Charting.For<MeasureModel>(mapper);

            //the ChartValues property will store our values array
            ChartValues = new ChartValues<MeasureModel>();
            cartesianChart1.Series = new SeriesCollection
            {
                new LineSeries
                {
                   //Configuration=mapper,
                    Values = ChartValues,
                    PointGeometrySize = 18,
                    StrokeThickness = 4
                }
            };
            cartesianChart1.AxisX.Add(new Axis
            {
                DisableAnimations = true,
                LabelFormatter = value => new System.DateTime((long) value).ToString("mm:ss"),
                Separator = new Separator
                {
                    Step = TimeSpan.FromSeconds(1).Ticks
                }
            });

            SetAxisLimits(System.DateTime.Now);

            //The next code simulates data changes every 500 ms
            Timer = new Timer
            {
                Interval = 500
            };
            Timer.Tick += TimerOnTick;
            R = new Random();
            Timer.Start();

最后就是

 private void SetAxisLimits(System.DateTime now)
        {
            cartesianChart1.AxisX[0].MaxValue = now.Ticks + TimeSpan.FromSeconds(1).Ticks; // lets force the axis to be 100ms ahead
            cartesianChart1.AxisX[0].MinValue = now.Ticks - TimeSpan.FromSeconds(8).Ticks; //we only care about the last 8 seconds
        }

        private void TimerOnTick(object sender, EventArgs eventArgs)
        {
            var now = System.DateTime.Now;

            ChartValues.Add(new MeasureModel
            {
                DateTime = now,
                Value = R.Next(0, 30)
            });

           SetAxisLimits(now);

            //lets only use the last 30 values
            if (ChartValues.Count > 30) ChartValues.RemoveAt(0);
        }

最后,欢迎关注我的公号,里面不定期分享PLC程序代码和学习知识等,欢迎互相交流学习。 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Matrix Y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值