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 = ; 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动态加载数据(像股票一样的波动)的更多相关文章
- AppCan学习笔记----关闭页面listview动态加载数据
AppCan页面关闭 AppCan 的页面是由两个HTML组成,如果要完全关闭的话需要在主HTML eg.index.html中关闭,关闭方法:appcan.window.close(-1); 管道 ...
- [JS前端开发] js/jquery控制页面动态加载数据 滑动滚动条自动加载事件
页面滚动动态加载数据,页面下拉自动加载内容 相信很多人都见过瀑布流图片布局,那些图片是动态加载出来的,效果很好,对服务器的压力相对来说也小了很多 有手机的相信都见过这样的效果:进入qq空间,向下拉动空 ...
- 微信小程序(五) 利用模板动态加载数据
利用模板动态加载数据,其实是对上一节静态数据替换成动态数据:
- mui 动态加载数据出现的问题处理 (silder轮播组件 indexedList索引列表 下拉刷新不能继续加载数据)
mui-slider 问题:动态给mui的图片轮播添加图片,轮播不滚动. 解决:最后把滚动轮播图片的mui(".mui-slider").slider({interval: 300 ...
- ASP.NET MVC动态加载数据
ASP.NET MVC动态加载数据,一般的做法是使用$.each方法来循环产生tabel: 你可以在html时先写下非动态的部分: Source Code 上图中,有一行代码: <tbody ...
- js实现滚动条来动态加载数据
主要angular2+es6 data:Array<any> //展示的数据 allData:Array<any> //全部的数据 size:number = 10 //每次动 ...
- js/jquery控制页面动态加载数据 滑动滚动条自动加载事件--转他人的
js/jquery控制页面动态加载数据 滑动滚动条自动加载事件--转他人的 相信很多人都见过瀑布流图片布局,那些图片是动态加载出来的,效果很好,对服务器的压力相对来说也小了很多 有手机的相信都见过这样 ...
- js动态加载数据并合并单元格
js动态加载数据合并单元格, 代码如下所示,可复制直接运行: <!DOCTYPE HTML> <html lang="en-US"> <head> ...
- 爬虫--selenuim和phantonJs处理网页动态加载数据的爬取
1.谷歌浏览器的使用 下载谷歌浏览器 安装谷歌访问助手 终于用上谷歌浏览器了.....激动 问题:处理页面动态加载数据的爬取 -1.selenium -2.phantomJs 1.selenium 二 ...
随机推荐
- Express框架开发知识点总结
express --view=pug myapp 以上语句在当前工作目录中创建名为 myapp 的 Express 应用程序,采用的模板是jade. 以前还在纠结使用hbs模板引擎或者ejs模板,实际 ...
- Onvif协议及其在Android下的实现
好久没有写博客,今天将前段时间做的Onvif协议在Android上的实现分享给大家. 首先,我们先来了解一下什么是Onvif协议:ONVIF 协议是由Open Network Video Interf ...
- 图解 HTTP 笔记(四)——HTTP 状态码
本章主要内容是了解 HTTP 状态码的工作机制 状态码的职责是当客户端向服务器端发送请求时,描述返回的请求结果.借助状态码,我们可以了解这次请求是否在服务器端得到了正常的处理. 状态码从其含以上可以分 ...
- js 高级程序设计 第三章学习笔记——Number数据类型需要注意的事项
1.浮点数值 虽然小数点前面可以没有整数,但是并不推荐这种写法. 由于保存浮点数值需要的内存空间是保存整数值的两倍,因此ECMAScript会不失时机地将浮点数值转化为整数数值.显然,如果小数点后面没 ...
- EasyNetQ使用(一)【介绍】
EasyNetQ 是一个容易使用,专门针对RabbitMQ的 .NET API. 假如你尽可能快的想去安装和运行RabbitMQ,请去看入门指南.EasyNetQ是为了提供一个尽可能简洁的适用与Rab ...
- 使用 bash 脚本把 AWS EC2 数据备份到 S3
目录 一.IAM 秘钥授权方式(普通) 1.1.打开 IAM 1.2.添加用户 1.3.安装和配置 AWS CLI 1.4.配置授权 二.IAM 角色授权方式(安全) 2.1.创建一个 EC2 访问 ...
- BP神经网络算法预测销量高低
理论以前写过:https://www.cnblogs.com/fangxiaoqi/p/11306545.html,这里根据天气.是否周末.有无促销的情况,来预测销量情况. function [ ma ...
- ffmpeg 编译集成libfdk-aac
目录 1. 编译libfdk-aac 2. 编译ffmpeg 1. 编译libfdk-aac 下载源码:$ git clone https://github.com/mstorsjo/fdk-aac. ...
- Lua中用table统一管理需要获取的unity物体
unity上的组件,可以用table统一管理 然后在初始化时候统一给table赋值,这样需要用到时候直接调用table中对应的key便可拿到对应的物体,省下了在脚本开头一堆声明的脚本,这样就不用声明这 ...
- 为 Exchange 2010 用户添加联系人头像
一.修改AD架构 为了给联系人添加头像,实际是让联系人头像缩略图能够显示在全局地址列表 GAL 中,需要让其在全局编录(GC)中进行复制,默认情况下,对象的“thumbnailphoto”属性值不会在 ...