【问题标题】:Chart Auto Scroll (Oscilloscope Effect)图表自动滚动(示波器效果)
【发布时间】:2018-04-28 11:28:45
【问题描述】:

我的问题是,每当我在图表中添加一个点时,它都会压缩所有点。相反,我希望它自动滚动。

这里有两个 .gif 来解释我的问题是什么

我现在拥有的

我想要达到的目标

我现在的代码是

    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 你能给我从左边删除一个点的代码吗?我想不出那个
  • chart1.Series["Light"].Points 是一个列表。寻找一种从列表中删除元素的方法。这就是你所需要的。

标签: c# winforms scroll mschart


【解决方案1】:

您可以选择:

  • 您可以从左边删除一个点,每个点添加到右边(在某个数字之后)

  • 您可以移动 x 轴 MinimumMaximum

  • 您可以将图表设置为缩放&平移然后平移,即移动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 轴的 MinimumMaximum 均未设置,即它们是 double.NaN

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

第一个保持数据点计数低,但除了最后一个点外都丢失了。

让我们看看工作中的所有选项:

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

【讨论】:

  • tysm!!自从我加入堆栈溢出以来我得到的最佳答案:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-06
  • 2018-06-07
  • 1970-01-01
  • 2018-11-29
  • 1970-01-01
相关资源
最近更新 更多