【问题标题】:Accessing the Y value of a line chart based on cursor position根据光标位置访问折线图的 Y 值
【发布时间】:2016-11-07 14:03:19
【问题描述】:

我是图表新手,并且有一个看起来像这样的折线图。

垂直线是光标所在的位置,通过鼠标移动而不是鼠标点击进行更新。

正如标题所示,我想要做的是在垂直线和“数据线”相交的点处访问 Y 值。

我已经尝试过了 - Get Y value of series from the X Cursor position where a ChartArea is clicked on,但除非我遗漏了什么,否则它不起作用,它会根据您使用的数据点返回系列中的第一个或最后一个值。

我已经尝试过 hittestresult,这似乎只有在您“触摸”数据线本身时才有效。

有什么想法吗?

【问题讨论】:

  • my answer here 工作吗?
  • 您使用的是哪个图表控件?
  • 代码可以正常工作,只要您的图表填写正确。您应该展示如何添加数据点,以便我们可以确定您的 x 值! x 值很可能是非数字的;这是您应该纠正的常见错误!注意:如果您将它们添加为字符串,所有 x-values 实际上都是 0 并且代码确实不起作用..

标签: c# winforms charts


【解决方案1】:

由于您没有向我们展示任何代码并且没有回答我的问题,我只能假设您的图表没有有效的,即数字 x 值。

这意味着 x 值都是 0 并且不能用于任何事情:既不能用于设置缩放范围,也不能用于格式化轴或其他标签,也不能用于在 x 处查找 DataPoints -位置。

这可以称为“隐式索引”。结果类似于显式索引图表,将SeriesIsXValueIndexed 设置为true:DataPoints 排成一排,并且都以相同的距离显示。

通常不是人们想要的,我真的建议您通过添加DataPoints 来解决它,而不是这样:

for (int i = 0; i < count; i++) chart1.Series[0].Points.AddY(someYValue);

但可能是这样的:

for (int i = 0; i < count; i++) chart1.Series[0].Points.AddXY(i, someYValue);

那么linked answer 就可以正常工作了。

但这里只是为了说明您如何可以解决方法,即如何在索引图表中找到两个最近的点。

请注意,它使用一个函数(实际上是两个)来计算内部绘图位置的像素矩形。你可以找到他们herehere..:

private void chart1_MouseMove(object sender, MouseEventArgs e)
{
    ChartArea ca = chart1.ChartAreas[0];
    Series S = chart1.Series[0];
    RectangleF rf = InnerPlotPositionClientRectangle(chart1, ca);
    float px = (float)( (e.X - rf.X) * S.Points.Count / rf.Width );

    int p0 = (int)px;  // previous point
    int p1 = p0 + 1;   // next point

    if (p0 >= 0 &&  p0 < S.Points.Count)
        Console.WriteLine( "DataPoint # " + p0 + " has a y-value of " + 
                           S.Points[p0].YValues[0].ToString("0.00"));
    //..
}

它会起作用,但您确实应该更正添加数据点的方式!

【讨论】:

  • 抱歉耽搁了,您在底部的代码完美地完成了这项工作,非常感谢,尽管我会按照您的建议尝试并正确完成。
  • 我使用 Points.AddXY 而不是 AddY,你说得对,链接的答案也有效。
猜你喜欢
  • 1970-01-01
  • 2015-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-22
相关资源
最近更新 更多