我有一个在服务器上运行的程序,它每隔5秒就会为其数据联系Online-API。数据成对保存在数据库中。一对由UNIX-Timestamp和double值组成。 在我的C#应用程序中,我想同时显示2个API的值。 X轴包含时间戳,Y轴包含双精度值。 保证两个系列都具有相同的X值 - 只有Y值不同。它看起来像这样:
你可以看到我已经将ChartArea [0] .CursorX添加到图表(绿线)。它会像这样更新:
private void chart1_MouseMove(object sender, MouseEventArgs e)
{
Point p = new Point(e.X, e.Y);
chart1.ChartAreas[0].CursorX.SetCursorPixelPosition(p, true);
DateTime t = DateTime.FromOADate(chart1.ChartAreas[0].AxisX.PixelPositionToValue(e.X));
graph_time.Text = t.ToLongTimeString();
}
因此绿色CursorX设置为鼠标的X位置。但是,我将间隔设置为5秒。
我试图在带有这些行的标签中显示CursorX的X值
DateTime t = DateTime.FromOADate(chart1.ChartAreas[0].AxisX.PixelPositionToValue(e.X));
graph_time.Text = t.ToLongTimeString();
问题是,它显示了真实光标(我隐藏的)位置的X值,而不是绿线。如何获得绿线的X轴值?
我还想在两个单独的标签中显示绿色/蓝色和绿色/红色线的交叉点的值。有谁知道怎么做?我读到了HitTest,但你需要一个X和Y值。我需要像Vertical HitTest这样的东西。
是否有可能将绿线(ChartArea.CursorX)绑定到实际的现有DataPoints而不是设置间隔?因为它有两个问题: 1。当图表的对看起来像这样(时间戳,值){2,1.23},{7,43.2},{12,5.3}和CursorX间隔设置为5秒,CursorX停在X = 0,5,10而不是X = 2,7,12。 2。有时两对之间的时差不是5秒,有时可能是4或6.这是非常5秒的间隔会产生错误 - 因为我希望CusorX只停留在现有的数据点。
所以,就是这样。我今天第一次尝试使用C#中的图表,并且有很多很酷的想法出现在我脑海中 - 实现它们有很多问题。希望你们中的一些人擅长C#排行榜并且可以帮助我:)
谢谢!
答案 0 :(得分:0)
让我尝试回答而不进行测试..:
1 - 使用CursorX.Position获取光标所在的x值
2 - 找到光标前后的两个数据点并插入它们的Y值。您可以使用LINQ查找两个点。有关如何在点集合中搜索的示例,请参阅here。
3 - 见2!选择第一个或第二个或最近点;你需要将Interval设置为0。
答案 1 :(得分:0)
我昨天晚上尝试了一下,我的问题的解决方案实际上比我想象的容易。它几乎像TaW的回答
private void chart1_MouseMove(object sender, MouseEventArgs e)
{
if (e.X < 0 || e.Y < 0 || e.Location == prevPos)
return;
prevPos = e.Location;
if (this.graphShowingData == false)
return;
Point p = new Point(e.X, e.Y);
double searchVal = chart1.ChartAreas[0].AxisX.PixelPositionToValue(e.X);
foreach (DataPoint dp in chart1.Series["Series1"].Points)
{
if(dp.XValue >= searchVal)
{
chart1.ChartAreas[0].CursorX.SetCursorPosition(dp.XValue);
foreach(double yD in dp.YValues)
{
val_series1.Text = Math.Round(yD, 4).ToString();
}
break;
}
}
foreach (DataPoint dp in chart1.Series["Series2"].Points)
{
if (dp.XValue >= searchVal)
{
foreach (double yD in dp.YValues)
{
val_series2.Text = Math.Round(yD, 4).ToString();
}
break;
}
}
DateTime t = DateTime.FromOADate(chart1.ChartAreas[0].CursorX.Position);
graph_time.Text = t.ToLongTimeString();
}
此代码解决了我上面提到的所有三个问题。