图表仅隐藏零值

Chart simply hiding zero values

我有一个简单的 C# 图表绑定代码(运行良好),但需要设置一个循环来隐藏零值。该循环也非常适用于使用 arrDouble3 数组中的数据的 DataPoint arrP。

但是现在如何打印修改后的图表(显然最后一行不起作用)..非常感谢。

chart7.Series["Series3"].ChartType = SeriesChartType.Line;
chart7.Series["Series3"].Points.DataBindXY(xVal, arrDouble3);

foreach (Series series in chart7.Series)
{
   foreach (DataPoint arrP in series.Points)
   {
      if (arrP.YValues.Length > 0 && (double)arrP.YValues.GetValue(0) == 0)
      { 
          arrP.IsValueShownAsLabel = false;                   
      }
   }
}

chart7.Series["Series3"].Points.DataBindXY(xVal, arrP);    ????

DataPoint没有一个Visible属性,所以你真的不能隐藏点。

对于一些图表类型,如点、柱或条,您可以通过将 DataPoint.Color 设置为透明或图表的 BackColor 来 'fake' 隐藏点,但这不起作用对于折线图,因为它会产生一个不可见的线段,从而打破系列的线。

有一个 属性 IsEmpty which you can set for some DataPoints but the result will still break the lines, no matter how you set the Series.EmptyPointStyle :

In the case of line-type charts, the line color for lines that connect to an empty point is determined by the Color property setting.

因此,无论您如何创建点,通过添加或数据绑定,您都无法隐藏一些点。

相反,我看到了两个选项:

  • 您可以简单地删除 Y 值为零的点。

  • 或者您可以操纵这些点,使它们与其他线条融合在一起,就好像它们根本不存在一样:为此,您需要将 Y 值设置为合适的平均值,使入线和出线具有与连接相邻点的线相同的斜率。

当x值区间相等时,后一种方法更简单;真正的问题是您丢失了有关 Y 值实际上为零的信息。您可以在 Tag 属性 的要点中注明这一事实。 - 你还需要考虑第一个和最后一个点,因为它们只有一个邻居并且连续有几个 zeor-points..

前一种方法很直接,你可以在一个循环中完成,实际上在你已经有了的循环中。您在这里可能遇到的问题是当您需要访问这些点的数据时该怎么做。一种选择是将它们收集到一个列表中,或者如果您更喜欢在索引将是键的字典中。

当然你不能真正删除 DataPoints 因为它们是数据绑定的,所以你需要从 DataSource 中删除它们,或者如果你愿意,创建一个额外的绑定源而不零值..:[=​​27=]

var arrayNZ = array1.Select(x => x).Where(x => x != 0).ToArray();

您可能需要调整 X 值才能立即使用!

更新:虚线的问题可能没有实际意义,因为你所有的 'hidden' 点都位于图表的一端。

所以您需要做的就是在循环中添加一行:

  arrP.IsValueShownAsLabel = false;                   
  arrP.IsEmpty = true;                   

如果您可以将其添加为一个 extended property to the binding by using the Series.DataBind method; but as I have shown here 将更简单,只有一小部分可绑定属性实际适用于此调用..

下面是 'broken' 线位于点中间时的样子: