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,選擇折線圖,效果如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM