我正在使用 Visual Studio 2017,并尝试使用 C# 和 winform 制作一个在散点图中显示实时值的程序。
通过下面的源代码,我能够让它显示实时值,每当事件发生并且它获得新值(每秒 3~5 次)。
valueArray 通过 GetRealTimeData 函数不断获取新值,图表显示数组中的所有元素。
valueArray[valueArray.Length - 1] = Convert.ToDouble(GetRealTimeData().Trim());
Array.Copy(valueArray, 1, valueArray, 0, valueArray.Length - 1);
this.chart1.Series["Series1"].Points.Clear();
this.chart1.Series["Series1"].Points.DataBindY(valueArray);
然而,我在使用这个程序时遇到了一个问题,即即使它在图表中显示 3,000 个值,它也会消耗大量计算机资源。
我计划让图表代表 50,000 到 100,000 个值,但我认为每次获得新值时复制和显示旧值会占用太多资源。
我想知道是否有任何函数或方法可以完成此类工作。如果我能得到一些建议或想法,我将不胜感激。
据我所知,几乎没有任何理由加载任何超过 100,000 点的图表。您可以使用原始点的一小部分来呈现数据,而不会丢失任何数据视觉信息。以下是将 100,000 个点过滤为 250 个点 (0.25%) 的示例:
![enter image description here](https://i.stack.imgur.com/0Noqt.gif)
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
double percent = 0.0025;
List<DataPoint> original = GetData();
List<DataPoint> filtered = Filter(original, percent);
foreach (DataPoint dp in original)
chart1.Series[0].Points.Add(dp);
foreach (DataPoint dp in filtered)
chart1.Series[1].Points.Add(dp);
chart1.ChartAreas[0].AxisY.Maximum = original.Max(dp => dp.YValues[0]);
chart1.ChartAreas[0].AxisY.Minimum = original.Min(dp => dp.YValues[0]);
chart1.ChartAreas[0].AxisX.Minimum = 0;
Text = string.Format("original = {0:0,0} points, filtered = {1:0,0} points, percent = {2:P2}", original.Count, filtered.Count, percent);
}
private List<DataPoint> Filter(List<DataPoint> orig, double percent)
{
Random r = new Random(DateTime.Now.Millisecond);
List<DataPoint> filt = new List<DataPoint>(orig.ToArray());
double total = filt.Count;
while (filt.Count / total > percent)
filt.RemoveAt(r.Next(1, filt.Count - 1));
return filt;
}
private void button1_Click(object sender, EventArgs e)
{
if (chart1.Series[0].Enabled)
{
chart1.Series[0].Enabled = false;
chart1.Series[1].Enabled = true;
}
else
{
chart1.Series[0].Enabled = true;
chart1.Series[1].Enabled = false;
}
}
}
我知道您正在动态添加点,因此您必须为其添加一些逻辑。但我的观点仍然成立:你must过滤您的数据。此外,如果您能找到一个更复杂的过滤器,您也可以使用它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)