【问题标题】:MsChart Select a portion of data and update ChartMsChart 选择一部分数据并更新图表
【发布时间】:2015-05-05 14:20:50
【问题描述】:

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

我想要完成的是允许用户选择该数据的一部分,我将开始和结束拖动到它上面,就像您在启用 x 轴时进行放大一样,并根据更新图表该选择,计算该数据子集的平均值。

使用

chart1.ChartAreas["ChartArea1"].CursorX.IsUserEnabled = Enabled;
chart1.ChartAreas["ChartArea1"].CursorX.IsUserSelectionEnabled = Enabled;

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

【问题讨论】:

  • 听起来像 this 的副本 - 当您缩放图表时,它会自动更新自身。如果除此之外你还想要什么?你提到的平均值是什么??
  • 它通过遍历构成图形的行数来收集平均值,例如,如果有 3000 行,它将从 0 - 3000 运行并除以 3000,但是除以只是放大它不会更新 X 轴的最大值和最小值,它只会显示放大的视图。如果它是从一半到最后选择的,那么 min = 1500 和 max = 3000 那么显然它类似于 for (i = min, i
  • 我还是不太确定:图表中的平均值是一部分还是您在其他地方显示?并且:当视图被缩放时,您是否希望仅从可见点计算平均值?
  • 我在其他地方展示了整个事物的平均值,但是一旦更新选择,我会在图表旁边更新它,是的,这是正确的 :)
  • 这意味着您需要更新平均值。放大或缩小以及滚动时,对吗?那么您需要一种获取第一个和最后一个可见点索引的方法吗?请参阅here 以获得解决方案! - 您可以编码Chart.AxisViewChanged Event 来进行新的计算..

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


【解决方案1】:

为了实现良好的缩放,您应该将此行添加到您显示的两条:

chart1.ChartAreas["ChartArea1"].AxisX.ScaleView.Zoomable = true;

这是一个计算可见点第一个 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 参数提供了视图的位置和大小的值,但这些只是数据点的XValues,而不是它们的索引;所以我们需要在Points 中从左侧搜索第一个点,从右侧搜索最后一个点。

更新 有时缩放会遇到一个特殊的问题:当数据比默认的CursorX.IntervalType 更细粒度时,它就不会让您缩放。在这种情况下,您只需适应数据的规模,例如像这样:CA.CursorX.IntervalType = DateTimeIntervalType.Milliseconds;

【讨论】:

  • 我实现了这个并且在表单的标题中没有任何更新,我现在使用一个工具提示,它在突出显示行时显示平均值,并且有五个系列可以做到这一点。是否可以在此处显示更新版本?
  • 表单标题中没有更新您是否连接了AxisViewChanged 事件?
  • 我现在正在使用一个工具提示,它在突出显示该行时显示平均值请解释这两件事的含义!突出显示是什么意思?用鼠标拖动图表?您的工具提示是否显示?
  • 啊菜鸟的错误,我没有,现在确实出现了平均值,但再次选择时不会改变。是的,将鼠标光标放在一条线上,工具提示会显示并显示平均值,如“Average:#AVG”,感谢您迄今为止的帮助。
  • 再次选择时不会改变 选择是指用鼠标左键拖动,对吧?当缩放更改时,或者当您使用滚动条在缩放视图中滚动时,应该触发事件 AxisViewChanged。可以?如果是这样,平均值将被重新计算,但可能仍保持不变,如果数字没有变化或变化不够......
猜你喜欢
  • 2022-09-27
  • 2017-03-17
  • 1970-01-01
  • 2018-12-23
  • 1970-01-01
  • 2011-01-28
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多