图表自动滚动(示波器效果)
Chart Auto Scroll (Oscilloscope Effect)
我的问题是,每当我向图表添加一个点时,它都会压缩所有点。相反,我希望它自动滚动。
这里有两张 .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);
}
}
您有以下选择:
右边每加一个点(一定数后)可以从左边去掉一个点
您可以移动 x 轴 Minimum
和 Maximum
值
您可以将图表设置为缩放&平移然后平移,即移动 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 轴的 Minimum
和 Maximum
都没有设置,即它们是 double.NaN
.
最后一个选项可让您方便地滚动数据。
第一个保持低数据点计数,但丢失了除最后一个点之外的所有点。
让我们看看所有的选择:
请注意,选项 2 和 3 还假定您具有有效的 x 值。如果不这样做,则需要使 x 轴索引并使用点索引而不是值。
我的问题是,每当我向图表添加一个点时,它都会压缩所有点。相反,我希望它自动滚动。
这里有两张 .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);
}
}
您有以下选择:
右边每加一个点(一定数后)可以从左边去掉一个点
您可以移动 x 轴
Minimum
和Maximum
值您可以将图表设置为缩放&平移然后平移,即移动
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 轴的 Minimum
和 Maximum
都没有设置,即它们是 double.NaN
.
最后一个选项可让您方便地滚动数据。
第一个保持低数据点计数,但丢失了除最后一个点之外的所有点。
让我们看看所有的选择:
请注意,选项 2 和 3 还假定您具有有效的 x 值。如果不这样做,则需要使 x 轴索引并使用点索引而不是值。