zoukankan      html  css  js  c++  java
  • dev linechart动态加载数据(像股票一样的波动)

    图片地址:https://blog.csdn.net/qq_33459369/article/details/80060196;(盗图)

    接下来是封装的代码

    #region 动态折线图
            public LineChartHelper(ChartControl chart)
            {
                LineSeriesView lineSeriesView = new LineSeriesView();
                chart.SeriesTemplate.View = lineSeriesView;
                //Legend的位置
                chart.Legend.AlignmentHorizontal = DevExpress.XtraCharts.LegendAlignmentHorizontal.Left;
                chart.Legend.AlignmentVertical = DevExpress.XtraCharts.LegendAlignmentVertical.TopOutside;
                chart.Legend.Direction = DevExpress.XtraCharts.LegendDirection.RightToLeft;
                //x轴为时间轴
                XYDiagram diagram = (XYDiagram)chart.Diagram;
                diagram.AxisX.DateTimeScaleOptions.MeasureUnit = DateTimeMeasureUnit.Millisecond;
                diagram.AxisX.DateTimeScaleOptions.ScaleMode = ScaleMode.Continuous;
            }
    
            public Series[] CreateSeries(ChartControl chart, List<string> names)
            {
                chart.Series.Clear();//清除Series
                int num = names.Count();
                Series[] series = new Series[num];
                for (int i = 0; i < num; i++)
                {
                    series[i] = CreateSeries(names[i], ViewType.Line);
                }
                return series;
            }
            /// <summary>
            /// 创建折线
            /// </summary>
            private Series CreateSeries(string caption, ViewType viewType)
            {
                Series series = new Series(caption, viewType);
                //必须设置ArgumentScaleType的类型,否则显示会转换为日期格式,导致不是希望的格式显示
                //也就是说,显示字符串的参数,必须设置类型为ScaleType.Qualitative
                series.ArgumentScaleType = ScaleType.Auto;
                series.LabelsVisibility = DevExpress.Utils.DefaultBoolean.True;//显示标注标签
                //回归线
                LineSeriesView lineSeriesView = new LineSeriesView();
                RegressionLine regressionLine = new RegressionLine();
                regressionLine.Name = caption + "1";
                lineSeriesView.Indicators.AddRange(new DevExpress.XtraCharts.Indicator[] { regressionLine });
                series.View = lineSeriesView;
                return series;
            }
            /// <summary>
            /// 移除不在视图显示的Points数据
            /// </summary>
            /// <param name="series">曲线</param>
            /// <param name="minDate">时间线</param>
            public void RemovePoint(DateTime minDate, Series[] series)
            {
                int pointsToRemoveCount = 0;//曲线节点数据
                foreach (SeriesPoint point in series[0].Points)
                {
                    if (point.DateTimeArgument < minDate)
                        pointsToRemoveCount++;
                }
                if (pointsToRemoveCount < series[0].Points.Count)
                {
                    pointsToRemoveCount--;
                }
                if (pointsToRemoveCount > 0)
                {
                    for (int i = 0; i < series.Count(); i++)
                    {
                        series[i].Points.RemoveRange(0, pointsToRemoveCount);
                    }
                }
            }
            /// <summary>
            /// 添加数据到曲线节点
            /// </summary>
            public void AddPoints(Series series, DateTime argument, double value)
            {
                if (series.View is LineSeriesView)
                {
                    series.Points.Add(new SeriesPoint(argument, value));
                }
            }
            /// <summary>
            /// 设置x轴数据
            /// </summary>
            public void SetX(ChartControl chart, DateTime minDate, DateTime argument)
            {
                XYDiagram diagram = (XYDiagram)chart.Diagram;
                if (diagram != null && (diagram.AxisX.DateTimeScaleOptions.MeasureUnit == DateTimeMeasureUnit.Millisecond || diagram.AxisX.DateTimeScaleOptions.ScaleMode == ScaleMode.Continuous))
                {
                    diagram.AxisX.WholeRange.SetMinMaxValues(minDate, argument);
                }
            }
            /// <summary>
            /// 获取曲线的回归线
            /// </summary>
            public RegressionLine GetRegressionLine(Series series)
            {
                if (series != null)
                {
                    SwiftPlotSeriesView swiftPlotView = series.View as SwiftPlotSeriesView;
                    if (swiftPlotView != null)
                    {
                        Console.Write(swiftPlotView.Indicators);
                        foreach (Indicator indicator in swiftPlotView.Indicators)
                        {
                            RegressionLine regressionLine = indicator as RegressionLine;
                            if (regressionLine != null)
                                return regressionLine;
                        }
                    }
                }
                return null;
            }
            #endregion

    调用代码

            private readonly Random random = new Random();
            private Series[] _series;
            private LineChartHelper _lineChartHelper;
            private int _num = 0;
    
            public frmRealtimeLineChart()
            {
                InitializeComponent();
    
            }
    
            private void frmRealtimeLineChart_Load(object sender, EventArgs e)
            {
                Init();
            }
    
            private void Init()
            {
                _lineChartHelper = new LineChartHelper(chart);
                List<string> names = new List<string>() { "曲线一", "折线二", "数字三" };
                _series = _lineChartHelper.CreateSeries(chart, names);
                _num = names.Count();
                chart.SeriesSerializable = _series;
    
                XYDiagram diagram = (XYDiagram)chart.Diagram;
                diagram.AxisX.GridLines.MinorVisible = true;
                diagram.AxisX.GridLines.Visible = true;
                diagram.AxisX.Label.TextPattern = "@{A:HH:mm:ss}";
                diagram.AxisX.Title.Font = new System.Drawing.Font("Tahoma", 9F);
                diagram.AxisX.Title.Text = @"时间(分)";
                diagram.AxisX.Title.Visible = true;
                diagram.AxisX.VisibleInPanesSerializable = "-1";
    
                diagram.AxisX.WholeRange.Auto = true;
                diagram.AxisX.WholeRange.SideMarginsValue = 1;
                diagram.AxisX.Interlaced = true;
                diagram.AxisY.WholeRange.AlwaysShowZeroLevel = false;
    
                diagram.AxisY.Title.Font = new System.Drawing.Font("Tahoma", 9F);
                diagram.AxisY.Title.Text = @"随机数";
                diagram.AxisY.Title.Visible = true;
                diagram.AxisY.VisibleInPanesSerializable = "-1";
            }
    
            private void timer_Tick(object sender, EventArgs e)
            {
                RealtimeChart();
            }
    
            private void RealtimeChart()
            {
                try
                {
                    DateTime argument = DateTime.Now;//x轴
                    for (int i = 0; i < _num; i++)
                    {
                        _lineChartHelper.AddPoints(_series[i], argument, CalculateNextValue());
                    }
                    DateTime minDate = argument.AddSeconds(-TimeInterval);//x轴时间曲度
                    _lineChartHelper.RemovePoint(minDate, _series);
                    _lineChartHelper.SetX(chart, minDate, argument);
                }
                catch (Exception ex)
                {
                    Console.Write(ex);
                }
            }
    
            /// <summary>
            /// 随机数
            /// </summary>
            private double CalculateNextValue()
            {
                return Math.Round(random.NextDouble() * 100.0);
            }
    
            /// <summary>
            /// 间隔时间
            /// </summary>
            private int TimeInterval { get { return Convert.ToInt32(spnTimeInterval.EditValue); } }

    直接拖入chart,选择折线图,效果如下:

  • 相关阅读:
    JDBC值事务
    JDBC之存储过程
    2016年计划要看的书,收集来自爱学习爱阅读的精英们
    step by step设置postgresql用户密码并配置远程连接
    在CentOS上搭建svn服务器及注意事项
    我为儿子开发的第一款Android App,用于九九乘法练习
    C语言实现九九乘法口诀表
    selenium-自动化测试51job网站(MacOS + Safari)2020年10月6日
    Oracle中row_number()、rank()、dense_rank() 的区别
    SQL错题集
  • 原文地址:https://www.cnblogs.com/shuaimeng/p/10948655.html
Copyright © 2011-2022 走看看