C# 如何通过在图表区域上移动鼠标来显示折线图的最近数据点信息
我将在Windows窗体应用程序中使用c#绘制图表。我需要在折线图上画一个圆圈,并在标签上显示该数据点值,当鼠标移动到图表区域上时,该标签是距离鼠标指针x轴最近的数据点 我写了一个代码如下C# 如何通过在图表区域上移动鼠标来显示折线图的最近数据点信息,c#,charts,C#,Charts,我将在Windows窗体应用程序中使用c#绘制图表。我需要在折线图上画一个圆圈,并在标签上显示该数据点值,当鼠标移动到图表区域上时,该标签是距离鼠标指针x轴最近的数据点 我写了一个代码如下 private void Chart1_MouseMove(object sender, MouseEventArgs e) { HitTestResult result = Chart1.HitTest(e.X, e.Y); DataPoint nearestPoi
private void Chart1_MouseMove(object sender, MouseEventArgs e)
{
HitTestResult result = Chart1.HitTest(e.X, e.Y);
DataPoint nearestPoint = null;
if (prevPosition!=null)
{
Chart1.Series[0].Points[prevPosition.PointIndex].MarkerStyle = MarkerStyle.None;
}
if (result.ChartElementType == ChartElementType.DataPoint)
{
string xValue = DateTime.FromOADate(Chart1.Series[0].Points[result.PointIndex].XValue).ToString("yyyy/MM/dd");
string yValue = Convert.ToString(Chart1.Series[0].Points[result.PointIndex].YValues[0]);
Chart1.Series[0].Points[result.PointIndex].MarkerStyle = MarkerStyle.Circle;
Chart1.Series[0].Points[result.PointIndex].MarkerSize = 7;
Chart1.Series[0].Points[result.PointIndex].MarkerColor = Color.Green;
label1.Text = "Date:" + xValue;
label2.Text = "Price:" + yValue;
prevPosition = result;
}
但当鼠标移到所描绘的线附近时,此代码将显示该值和相应的线上方圆。当鼠标远离直线但在图表区域内时,它不会显示圆和值。我需要在离鼠标指针X轴最近的直线点上画一个圆圈,并在标签上显示该数据您可以找到仅测量X值或y值或测量绝对距离的最近点。或者,您可以简单地在鼠标光标下输出值,而不管点是什么。最后一个 对于前三个选项中的每一个,这都会有所帮助: 用于设置和重置颜色的类级别变量..:
DataPoint dpXaxis = null;
DataPoint dpYaxis = null;
DataPoint dpAbs = null;
以及用于保留所有点的像素位置的点列表:
List<Point> pixPoints = null;
要查找两个方向上最接近的点,您需要包括轴的比例,或者,可能更容易,从保存点位置(以像素为单位)的数据点创建列表。为此,请使用反转轴功能。然后我以与上面Linq类似的方式计算delta
列表将按如下方式填充/更新:
List<Point> getPixPoints(Series s, ChartArea ca)
{
List<Point> points = new List<Point>();
foreach (DataPoint dp in s.Points)
{
points.Add(new Point(
(int)ca.AxisX.ValueToPixelPosition(dp.XValue),
(int)ca.AxisY.ValueToPixelPosition(dp.YValues[0]) ));
}
return points;
}
列出getPixPoints(系列s,ChartArea ca)
{
列表点=新列表();
foreach(s.Points中的数据点dp)
{
点。添加(新点)(
(int)约轴x.ValueToPixelPosition(dp.XValue),
(int)ca.AxisY.ValueToPixelPosition(dp.y值[0]);
}
返回点;
}
让我们在工作中看到它:
谢谢。第一个是我想要做的,但有时它会给出错误信息。“Position参数应在0到100之间。此行的参数名称:Position”。双值=最大像素位置值(e.X);这将是令人惊讶的。可能是你写的PositionToValue
??位置是第三个坐标系,表示百分比。如果我将位置写入值,它会给出相同的错误。当图表上没有图表时,问题实际上会发生。在我的例子中,图形是在按钮点击事件上绘制的。啊,好的。这将是错误的。但是如果图表上没有数据,轴就不能工作。因此,您需要在事件开始处添加一个检查。我已经更新了答案。。
List<Point> getPixPoints(Series s, ChartArea ca)
{
List<Point> points = new List<Point>();
foreach (DataPoint dp in s.Points)
{
points.Add(new Point(
(int)ca.AxisX.ValueToPixelPosition(dp.XValue),
(int)ca.AxisY.ValueToPixelPosition(dp.YValues[0]) ));
}
return points;
}