【问题标题】:get chart value in point以点为单位获取图表值
【发布时间】:2017-09-07 09:04:29
【问题描述】:

例如,我有 2 个点的图表 - 0,0 和 10,10,图表类型是 FastLine。 我想知道图表中选择的 X 值中的 Y 值。

例如,当 X 为 5 时,我想知道 Y 为 5。

我的图表比较复杂,有很多点,我需要通过 X 得到 Y 值。

我该怎么做?

【问题讨论】:

  • 这实际上是不可能的,除非您在给定的 x 值上确实有一个或多个点。您所能做的就是尝试通过简单的数学插值 y 值。请注意,折线图允许您随着线条来回移动,因此任何 x 值都可以有许多 y 值,并且穿过它的线可能会穿过许多图表线。 - 对于插值,您需要找到两个相邻点并使用它们。数学真的很琐碎。
  • 我想如果已经计算并绘制了线,我可以在 X 上获得 Y 的值,即使那里没有一点。我想在某个 X 上获取每个系列的 Y 值,以便稍后对其进行总结并创建 1 个图表,例如总余额。
  • 是的,如果它真的只是一条线而不是一条曲线,你可以计算它上面的任何点,就像我说的那样。但这意味着您需要知道那条线的端点。从那里开始很简单,如果您知道 x-vlues 将始终向前发展,这一点也不难..

标签: c# winforms mschart


【解决方案1】:

问题归结为两个任务:

  • 查找 x 值的相邻点
  • 为给定的 x 值插入它们的 y 值。

如果 x 值确实在稳步增加,这应该可以解决这两个问题:

double interpolatedY(Series s, double xval)
{
    DataPoint pPrev = s.Points.Last(x => x.XValue <= xval);
    DataPoint pNext = s.Points.First(x => x.XValue >= xval);

    if (pPrev == pNext) return pPrev.YValues[0];

    return pPrev.YValues[0] + (pNext.YValues[0] - pPrev.YValues[0])
        * (xval  - pPrev.XValue)/ (pNext.XValue - pPrev.XValue); 
}

它使用 Linq 查找上一个和下一个数据点,然后使用简单的数学来查找插值。

请注意,大多数检查都被省略了!

这里我添加了一个相同的点序列和第三个来添加插值:

要在图表像素和值之间进行转换,有Axis 函数ValueToPixelPositionPixelPositionToValue,顺便说一句。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 2020-04-20
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    相关资源
    最近更新 更多