图表自动滚动(示波器效果)

8
我的问题是每次添加一个点到图表上时,它就会压缩所有的点。相反,我希望它能自动滚动。
这里有两个 .gif 图片来解释我的问题。
现在的情况如下:

enter image description here

我想要实现什么。

enter image description here

我现在拥有的代码是

    DateTime dt;

    private void Form1_Load(object sender, EventArgs e)
    {
        timer1.Start();
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        dt = DateTime.Now;
        if (checkBox1.Checked)
        {
            chart1.Series["Light"].Points.AddXY(dt.ToShortTimeString(), 1);
        }
        else
        {
            chart1.Series["Light"].Points.AddXY(dt.ToShortTimeString(), 0);
        }

    }

每次在右侧添加1个点时,您必须从左侧删除1个点。这样,您可以同时保留相同数量的信息,但只是通过某些偏移量移动它。 - FCin
@FCin,你能给我删除左侧点的代码吗?我无法解决这个问题。 - SunAwtCanvas
chart1.Series["Light"].Points 是一个列表。寻找一个从列表中删除元素的方法即可。这就是你需要的全部。 - FCin
1个回答

18

您有几个选项:

  • 您可以从左边删除一个点,以便在右边添加一个点(在一定数量之后)

  • 您可以移动x轴的最小值最大值

  • 您可以设置图表进行缩放和平移,然后平移即移动ScaleView

第一种选择很简单,将保持DataPoints数量不变。这可能是好事或坏事,具体取决于您的需求。

其他两种选项将保留点的集合,并且仅在图表中进行平移。

常见参考资料:

ChartArea ca = chart.ChartAreas[0];
Series s = chart.Series[0];

以下是第一种选择的代码:

s.Points.AddXY(..);
s.Points.RemoveAt(0);
ca.AxisX.Minimum = double.NaN;
ca.AxisX.Maximum = double.NaN;
ca.RecalculateAxesScale();

以下是选项2的代码:

int ix = s.Points.AddXY(..);

ca.AxisX.Maximum  = s.Points[ix].XValue;
ca.AxisX.Minimum += s.Points[ix].XValue - s.Points[ix-1].XValue;
ca.RecalculateAxesScale();

以下是选项3的代码:

int ix = s.Points.AddXY(..);
ca.AxisX.Minimum = double.NaN;
ca.AxisX.Maximum = double.NaN;
ca.RecalculateAxesScale();

ca.AxisX.ScaleView.Zoom(s.Points[ix-pointMax ].XValue, s.Points[ix].XValue );

这假定系列中已经有pointMax个点。

所有示例都假设您已经有了一些点。选项1和3还假定x轴的最小值最大值都没有设置,即它们是double.NaN

最后一个选项将让您方便地滚动数据。

第一种方法保持数据点数量较少,但会失去除最后一个点外的所有点。

让我们观察所有选项的效果:

输入图像描述

请注意,选项2和3还假设您有有效的x值。如果没有,则需要使x轴进行索引,并使用点索引而不是值。


非常感谢!自从我加入Stack Overflow以来,这是我得到的最佳答案 :) - SunAwtCanvas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接