我创建了一个程序,该程序读入文本文件并将该文件中的数据显示到DataGridView中;然后,我使用来自此DGV的数据来更新图表'根据结果,图表只包含折线图。
我想要完成的是允许用户选择该数据的一部分,我拖动它的开头和结尾,就像你只想启用x轴一样放大,并更新图形根据该选择,计算该数据子集的平均值。
使用
displayConnectivityProblemDialog()
这允许我选择区域并放大,但我不确定如何根据选择而不仅仅是缩放来实际更新数据。
答案 0 :(得分:1)
要允许漂亮的缩放,您应该将此行添加到您显示的两行:
chart1.ChartAreas["ChartArea1"].AxisX.ScaleView.Zoomable = true;
这是一个计算可见点'1st YValues:
平均值的函数private void chart1_AxisViewChanged(object sender, ViewEventArgs e)
{
// for a test the result is shown in the Form's title
Text = "AVG:" + GetAverage(chart1, chart1.Series[0], e);
}
double GetAverage(Chart chart, Series series, ViewEventArgs e)
{
ChartArea CA = e.ChartArea; // short..
Series S = series; // references
DataPoint pt0 = S.Points.Select(x => x)
.Where(x => x.XValue >= CA.AxisX.ScaleView.ViewMinimum)
.DefaultIfEmpty(S.Points.First()).First();
DataPoint pt1 = S.Points.Select(x => x)
.Where(x => x.XValue <= CA.AxisX.ScaleView.ViewMaximum)
.DefaultIfEmpty(S.Points.Last()).Last();
double sum = 0;
for (int i = S.Points.IndexOf(pt0); i < S.Points.IndexOf(pt1); i++)
sum += S.Points[i].YValues[0];
return sum / (S.Points.IndexOf(pt1) - S.Points.IndexOf(pt0) + 1);
}
请注意,ViewEventArgs
参数提供了View的位置和大小的值,但这些只是数据点的XValues
而不是它们的索引;所以我们需要从左边的Points
搜索第一个,从右边搜索最后一个点。
更新有时缩放遇到一个特殊问题:当数据比默认CursorX.IntervalType
更细粒度时,它就不会让您缩放。在这种情况下,您只需要适应数据的规模,例如:像这样:CA.CursorX.IntervalType = DateTimeIntervalType.Milliseconds;