MsChart选择一部分数据并更新图表

时间:2015-05-05 14:20:51

标签: c# visual-studio-2013 graph charts mschart

我创建了一个程序,该程序读入文本文件并将该文件中的数据显示到DataGridView中;然后,我使用来自此DGV的数据来更新图表'根据结果​​,图表只包含折线图。

我想要完成的是允许用户选择该数据的一部分,我拖动它的开头和结尾,就像你只想启用x轴一样放大,并更新图形根据该选择,计算该数据子集的平均值。

使用

displayConnectivityProblemDialog()

这允许我选择区域并放大,但​​我不确定如何根据选择而不仅仅是缩放来实际更新数据。

1 个答案:

答案 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;