图片地址: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 = ; 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 + "";
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 = ;//曲线节点数据
foreach (SeriesPoint point in series[].Points)
{
if (point.DateTimeArgument < minDate)
pointsToRemoveCount++;
}
if (pointsToRemoveCount < series[].Points.Count)
{
pointsToRemoveCount--;
}
if (pointsToRemoveCount > )
{
for (int i = ; i < series.Count(); i++)
{
series[i].Points.RemoveRange(, 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 = ; 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 = ;
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 = ; 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,选择折线图,效果如下:

dev linechart动态加载数据(像股票一样的波动)的更多相关文章

  1. AppCan学习笔记----关闭页面listview动态加载数据

    AppCan页面关闭 AppCan 的页面是由两个HTML组成,如果要完全关闭的话需要在主HTML eg.index.html中关闭,关闭方法:appcan.window.close(-1); 管道 ...

  2. [JS前端开发] js/jquery控制页面动态加载数据 滑动滚动条自动加载事件

    页面滚动动态加载数据,页面下拉自动加载内容 相信很多人都见过瀑布流图片布局,那些图片是动态加载出来的,效果很好,对服务器的压力相对来说也小了很多 有手机的相信都见过这样的效果:进入qq空间,向下拉动空 ...

  3. 微信小程序(五) 利用模板动态加载数据

    利用模板动态加载数据,其实是对上一节静态数据替换成动态数据:

  4. mui 动态加载数据出现的问题处理 (silder轮播组件 indexedList索引列表 下拉刷新不能继续加载数据)

    mui-slider 问题:动态给mui的图片轮播添加图片,轮播不滚动. 解决:最后把滚动轮播图片的mui(".mui-slider").slider({interval: 300 ...

  5. ASP.NET MVC动态加载数据

    ASP.NET MVC动态加载数据,一般的做法是使用$.each方法来循环产生tabel: 你可以在html时先写下非动态的部分:  Source Code 上图中,有一行代码: <tbody ...

  6. js实现滚动条来动态加载数据

    主要angular2+es6 data:Array<any> //展示的数据 allData:Array<any> //全部的数据 size:number = 10 //每次动 ...

  7. js/jquery控制页面动态加载数据 滑动滚动条自动加载事件--转他人的

    js/jquery控制页面动态加载数据 滑动滚动条自动加载事件--转他人的 相信很多人都见过瀑布流图片布局,那些图片是动态加载出来的,效果很好,对服务器的压力相对来说也小了很多 有手机的相信都见过这样 ...

  8. js动态加载数据并合并单元格

    js动态加载数据合并单元格, 代码如下所示,可复制直接运行: <!DOCTYPE HTML> <html lang="en-US"> <head> ...

  9. 爬虫--selenuim和phantonJs处理网页动态加载数据的爬取

    1.谷歌浏览器的使用 下载谷歌浏览器 安装谷歌访问助手 终于用上谷歌浏览器了.....激动 问题:处理页面动态加载数据的爬取 -1.selenium -2.phantomJs 1.selenium 二 ...

随机推荐

  1. docker 容器连接 host的sql server失败

    报错内容::“A network-related or instance-specific error occurred while establishing a connection to SQL ...

  2. linux系统安装硬盘分区建议

      一.常见挂载点的情况说明一般来说,在linux系统中都有最少两个挂载点,分别是/ (根目录)及 swap(交换分区),其中,/ 是必须的: 详细内容见下文: 安装系统时选择creat custom ...

  3. Redis监控之redis-stat安装与详解

    一.安装环境 安装编译环境.ruby运行环境.git代码 yum install gcc-c++ yum -y install ruby-devel yum install ruby yum inst ...

  4. 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_12-删除页面-服务端-接口开发

    删除页面 api里面定义接口 返回类型是ReponseResult @ApiOperation("删除页面") public ResponseResult delete(Strin ...

  5. Hystrix-基本概念(设计原则和两种隔离技术)

    一.Hystrix是什么在微服务的架构系统中,每个服务都可能会调用很多其他服务,被调用的那些服务就是依赖服务.有的时候某些依赖服务出现故障也是很正常的.Hystrix可以让我们在对服务间的调用进行控制 ...

  6. EasyNetQ使用(四)【Request与Response,Send与Receive】

    EasyNetQ也支持Request/Response这种方式的消息模式.这种方式很容易在client/Server应用中执行,客户端发送一个请求到服务器,服务器然后处理请求后返回一个响应.和传统的R ...

  7. 让SNIPER-MXNet从标准的COCO格式数据集中直接使用file_name作为图片路径

    告别项目中“依index生成路径”的方法,直接使用我们在生成.json标签时就已经写入的图片路径(这里我写入的是绝对路径 full path)来获取图片. 需要做的,用以下代码替换SNIPER/lib ...

  8. JUC AQS ReentrantLock源码分析

    警告⚠️:本文耗时很长,先做好心理准备,建议PC端浏览器浏览效果更佳. Java的内置锁一直都是备受争议的,在JDK1.6之前,synchronized这个重量级锁其性能一直都是较为低下,虽然在1.6 ...

  9. 为 Exchange 2010 用户添加联系人头像

    一.修改AD架构 为了给联系人添加头像,实际是让联系人头像缩略图能够显示在全局地址列表 GAL 中,需要让其在全局编录(GC)中进行复制,默认情况下,对象的“thumbnailphoto”属性值不会在 ...

  10. 01.02 linux命令(1

    =================常用的Linux命令============================Ls 查看当前文件夹下或者其他文件夹的文件列表或者文件夹列表Ls  -l 详细信息的列表L ...