【问题标题】:Chart simply hiding zero values图表只是隐藏零值
【发布时间】:2016-02-18 11:31:23
【问题描述】:

我有一个简单的 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);    ????

【问题讨论】:

  • 你想达到什么目的:使数据点不可见但仍然占用空间或完全抑制它们?
  • 实际上,我只是想在折线图中隐藏零 Y 值(在本例中为 arrDouble3)。 完美地绘制了线条,但仍然显示线条。
  • Taw,它现在完美运行。非常感谢。抱歉,我对投票程序不是很熟悉。
  • @joe 我使用了以下内容并且它有效......但我不得不用我用作数据的数组中的空值替换零:chart1.Series[0].EmptyPointStyle.IsValueShownAsLabel = false; chart1.Series[0].EmptyPointStyle.IsVisibleInLegend = true; 我想显示空值的图例,但是它没有工作

标签: c# charts bind


【解决方案1】:

DataPoint 没有 Visible 属性,因此您无法真正隐藏点。

对于多种图表类型,例如点、柱形或条形,您可以通过将DataPoint.Color 设置为透明或图表的BackColor 来“伪造”隐藏点,但这不适用于折线图,因为它会导致在一个不可见的线条片段中,打破了系列的线条。

有一个属性IsEmpty,您可以为一些DataPoints 设置它,但无论您如何设置Series.EmptyPointStyle,结果仍然会换行:

对于线型图表,连接线的线条颜色 到空点由 Color 属性设置确定。

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

相反,我看到两个选项:

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

  • 1234563入线和出线都与连接相邻点的线具有相同的斜率。

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

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

当然,您实际上不能删除 DataPoints,因为它们是数据绑定的,因此您需要从 DataSource 中删除它们,或者如果您愿意,可以创建一个额外的不带零值的绑定源。 :

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

您现在可能需要调整 X 值才能使用!

更新:虚线的问题可能没有实际意义,因为您所有的“隐藏”点都位于图表的一端。

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

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

如果您可以使用Series.DataBind 方法将其作为extended property 添加到绑定中,那就更简单了;但正如我向here 展示的那样,只有一小部分可绑定属性实际上与此调用一起使用..

当“断”线位于点的中间时,它们的外观如下:

【讨论】:

  • TaW,非常感谢您的全面评论。实际上,我在堆栈溢出中发现了这个( Foreach .. arrP.IsValueShownAsLabel = false; .. )循环。如果我理解正确最简单的a
  • 抱歉丢失了 2 部分。如果我理解正确,最简单的方法是从数据源中删除 Y 零数据点。但是我可以从 DataSource 中删除 DataPoints .. 吗?谢谢。
  • 据我了解,删除 DataPoint 将是 非常感谢您的帮助 TaW
  • 我不知道你的数据源。但是你肯定可以创建一个没有零分的副本..:var arr2 = arr1.Select(x => x).Where(x => x != 0).ToArray();
  • 嗯,用IsEmpty 标记它们听起来很有趣,但是对于折线图它仍然会导致问题,所以你可能需要在我的答案中选择两个选项之一。看前面的评论!还有更新的答案.. 你能告诉我更多关于 DataSource(es) 的信息吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-23
  • 1970-01-01
  • 2016-01-01
相关资源
最近更新 更多