gpt4 book ai didi

c# - 在 mschart 中添加数据点时使用双标签

转载 作者:行者123 更新时间:2023-11-30 12:38:22 24 4
gpt4 key购买 nike

我正在用 C#.Net WinForms 编写代码以在单击图表上的某些数据点时添加标签。在单击图表之前,图表看起来像这样。

Chart before click

现在我单击 330-340 之间的数据点。该图表显示了带有双标签 (338.61) 的选定数据点。如下所示: Chart after click

调试输出如下: Debug Output

下面是 chart_mouseclick 的代码

private void chart1_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
double mouse_Xvalue = chart1.ChartAreas[0].AxisX.PixelPositionToValue(e.X);
double mouse_Yvalue = chart1.ChartAreas[0].AxisY.PixelPositionToValue(e.Y);

DataPoint Prev_DataPoint = chart1.Series[0].Points.Select(x => x)
.Where(x => x.XValue >= mouse_Xvalue)
.DefaultIfEmpty(chart1.Series[0].Points.First()).First();

DataPoint Next_DataPoint = chart1.Series[0].Points.Select(x => x)
.Where(x => x.XValue <= mouse_Xvalue)
.DefaultIfEmpty(chart1.Series[0].Points.Last()).Last();

DataPoint Add_DataPoint = Math.Abs(Prev_DataPoint.XValue - mouse_Xvalue) < Math.Abs(Next_DataPoint.XValue - mouse_Xvalue) ? Prev_DataPoint : Next_DataPoint;

int add_data_point_index = chart1.Series[0].Points.IndexOf(Add_DataPoint);

DataPoint max = Add_DataPoint;
for (int i = add_data_point_index - 10; i <= add_data_point_index + 10; i++)
{
DataPoint dp = chart1.Series[0].Points[i];

if (dp.YValues[0] > max.YValues[0])
{
add_data_point_index = i;
max = dp;
}
}

chart1.Series[1].Points.Add(max);
chart1.Series[1].Sort(PointSortOrder.Ascending, "X");

for (int i = 0; i < chart1.Series[1].Points.Count; i++)
{
chart1.Series[1].Points[i].Label =
Math.Round(chart1.Series[1].Points[i].XValue, 2).ToString();
}
}
}

代码有什么问题?

最佳答案

这实际上是一个非常有趣的观察..

让我们看看第二个版本,它适合您:

chart1.Series[1].Points.AddXY(max.XValue, max.YValue[0])

或者简而言之:

series1.Points.AddXY(x,y);

这是添加 DataPoints 的正常方法:新点 是使用两个(或更多)值以及从 Series 中获取的所有其他属性创建的 默认值

“其他”属性包括颜色、标记和标签数据,包括IsValueShownAsLabel

这里没有惊喜。

现在是原始版本:

chart1.Series[1].Points.Add(max);

或者简而言之

series1.Points.Add(dp);

其中max(或dp)是第一个系列(series0).

这表现出惊人的不同..:

可以想象 DataPoint 会被移动(就像 Controls 那样),但事实并非如此。或者像字符串一样克隆。

相反,仅创建一个新引用并将其添加到 series1.Points。这会产生几个令人惊讶的后果……:

  • 两个引用都指向同一个数据点对象;所以突然在 series1 中有一个点具有从 series0 中获取的属性,包括 IsValueShownAsLabel!

  • 由于这两个系列现在都包含一个具有相同值/坐标的数据点,因此图表足够智能,可以稍微分开显示它们的标签以避免重叠。 这就是你看到的效果。

  • 如果您现在从其原始 series0 中删除数据点,series1 仍将包含对它的引用以及颜色、标签等,就像它在 series0 中一样。

所以确实没有办法使原始版本工作,因为对同一点的两个引用总是会使图表显示标签两次或根本不显示标签。

关于c# - 在 mschart 中添加数据点时使用双标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53273891/

24 4 0