我使用绘制时间序列中的点,如下所示
chart1.Series[0].Points.AddXY(time, voltage); 我得到了大量的数据(1点/ 100毫秒),所以在一天结束时,程序绘制新数据的速度非常慢。因此,我希望能够在一定时间后自动滚动图表的x轴,例如30分钟左右.我想保持数据绘制,但用户不能直接看到,但隐藏在图表的左边。
,我该怎么做?
发布于 2014-09-10 18:49:02
编辑:看到我的编辑在结束沿着一个解决方案,在您的集合缩放。
您应该只绘制可见的内容,而不是其他的.
要么将旧值保存在内存中,要么将它们保存到磁盘中,并根据需要加载它们。
这里有一个例子:
我有1000,000分,在内存中,我可以无缝滚动和绘图立即发生。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public List<int> Values { get; private set; }
public int ValuesToShow
{
get { return 20; }
}
private void Form1_Load(object sender, EventArgs e)
{
Values = new List<int>();
var random = new Random();
for (int i = 0; i < 1000000; i++)
{
int next = random.Next(10, 50);
Values.Add(next);
}
hScrollBar1.Maximum = (Values.Count - 1) - ValuesToShow;
}
private void hScrollBar1_Scroll(object sender, ScrollEventArgs e)
{
var hScrollBar = (HScrollBar) sender;
int value = hScrollBar.Value;
IEnumerable<int> enumerable = Values.Skip(value).Take(ValuesToShow);
chart1.Series.Clear();
var series = new Series();
foreach (int i in enumerable)
{
series.Points.Add((double) i);
}
chart1.Series.Add(series);
}
}
}结果:

备注:
1天的值= 86M点,乘以4(一个float的大小),你就可以得到350 of的数据。
我想你可以根据今天的个人电脑规格将这些数据保存在内存中,如果不是定期保存的话。
使用BinaryReader从文件中读取特定位置的值应该非常容易,我将其留给您作为练习;另外,在将它们保存到HDD之前,队列可能会帮助您暂时存储它们。
编辑
我试图使用带有缩放功能的官方方法,但我遇到了一些问题:
AxisViewChanging事件是没有结论的,比如当我们在滚动条->中的某个位置添加/删除更多的点时,滚动条将改变它的位置,即不对用户友好。(我刚在这个过程中停了下来,因为它太烦人/不可靠,海事组织)我的最后结论是:
要获得缩放,添加两个按钮将改变ValuesToShow的值。

显然,您失去了使用矩形选择点的能力,但是您几乎可以立即进入数据集中的任何部分。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public List<int> Values { get; private set; }
public int ValuesToShow { get; set; }
private void Form1_Load(object sender, EventArgs e)
{
ValuesToShow = 20;
Values = new List<int>();
var random = new Random();
for (int i = 0; i < 1000000; i++)
{
int next = random.Next(10, 50);
Values.Add(next);
}
hScrollBar1.Maximum = (Values.Count - 1) - ValuesToShow;
RefreshChart();
}
private void hScrollBar1_Scroll(object sender, ScrollEventArgs e)
{
RefreshChart();
}
private IEnumerable<int> GetCurrentValues(int value)
{
return Values.Skip(value).Take(ValuesToShow);
}
private int GetCurrentPosition()
{
return hScrollBar1.Value;
}
private void button1_Click(object sender, EventArgs e)
{
ValuesToShow /= 2;
RefreshChart();
}
private void button2_Click(object sender, EventArgs e)
{
ValuesToShow *= 2;
RefreshChart();
}
private void RefreshChart()
{
int value = GetCurrentPosition();
IEnumerable<int> enumerable = GetCurrentValues(value);
chart1.Series.Clear();
var series = new Series();
foreach (int i in enumerable)
{
series.Points.Add((double) i);
}
chart1.Series.Add(series);
}
}
}最后注记:
1M点似乎是合理的(20分钟的数据),更多,它开始放缓,我也尝试了8400万,但这是不切实际的。
为了使用户更加友好,您可能可以缩放,而用户使用鼠标轮。
如果您能够负担得起其他解决方案,您可能会获得良好的性能,与WPF和/或商业解决方案,如DevExpress,但你将不得不支付.在这里,我为您提供了一个0美元的解决方案,它只缺少一个选择矩形,但它总是快速的:D
https://stackoverflow.com/questions/25772228
复制相似问题