首页 > 解决方案 > 图表 xAxis 中的意外副作用设置点颜色

问题描述

point.IsEmpty用来隐藏图表中的某些点(异常值)。我有这个工作良好,但我注意到一些奇怪的事情。如果我恢复图表颜色,那么当该点被隐藏或取消隐藏时,它会显示在不同的位置。我什至不必恢复颜色;如果我只是简单地获取并存储相同的颜色值,就会出现副作用。

Color c = SavedColoredPoints[i].Color;;

foreach (DataPoint p in ChartScatter.Series[i].Points)
{
    Debug.Assert(!p.Color.IsEmpty);  // want to show all have been initialized 
    Color ThisC = p.Color;
    p.Color = ThisC;
    // p.Color = c;
}

ChartScatter.Series[i].Color = c;

上面的代码在运行时不会断言,因为所有颜色都已初始化。在在线搜索将颜色设置为点的问题时,我发现建议对空点使用透明,这也是我为所有系列所做的。它没有效果。

ChartScatter.Series[seriesname].EmptyPointStyle.Color = Color.Transparent;

我还阅读了 Microsoft 关于设置点颜色的旧博客: 设置 Microsoft 图表系列颜色

问题示例:一个系列中有 12 个点。如果我将所有 12 个点标记为“IsEmpty”,它们将显示在图表上。如果我不恢复默认颜色,这些点将保持隐藏状态,就像它们应该的那样:

红点

上面的红点不应该在那里。如果我“隐藏”原始点,它们往往会出现在非常靠近它们被删除的位置。它们实际上消失了,但像魔法一样立即相邻或上方。当 12 个中的最后一个被隐藏“IsEmpty”时,所有 12 个都显示在 60 秒标记周围。x 和 y 值都是正确的,但它们应该被隐藏。OTOH,如果我没有“恢复默认颜色”,那么当我取消隐藏它们时,它们会保持隐藏状态,并且图表的行为就像我想要的那样。

标签: c#charts

解决方案


这肯定看起来像 MSChart 中的一个错误。

如果你没看错,背后可能有一定的逻辑。

似乎正在发生的事情是这样的:图表显示的empty DataPoints不是它们的实际 y 值,而是它们之前的最后一个非空点之一。

结果看起来很傻,所以在你的情况下它是一个错误。Otoh,您使用该IsEmpty属性的方式不是为了:它旨在将数据的某些部分标记为“缺失”;因此它假定这些点无论如何都没有有效的y 值。但是对于许多图表类型,这可能会导致奇怪的结果,因此它会保留最后一个有效值..

一个典型的例子是包含每日数据但在周末没有有意义数据的图表。如果遗漏了丢失的数据,有些东西将不起作用,因此插入空的虚拟点。(事实上​​,甚至还有一个函数可以做到这一点。)

(请注意,这只是我的解释,而不是记录在案的功能!)

这不会导致您看到有趣的显示,因为您已将 设置EmptyPointStyle.ColorTransparent。但是:现在您更改所有点的颜色,这会覆盖系列样式的颜色,瞧:有趣的显示..:

在此处输入图像描述

解决方案:

  • Rescale您可以在函数中添加一行代码以在Transparent单个基础上再次创建点,然后从UnHide代码中调用它。(*)

  • 或者您可以完全停止(ab)使用该IsEmpty属性并通过将它们的颜色设置为透明来直接“隐藏”点。

(*) 另请注意链接中的引用:您始终可以通过将(系列和)数据点颜色属性设置为 Color.Empty 来切换回使用调色板颜色。(我的括号)

更新(*):我认为进行着色的最佳方法是对IsEmpty属性进行检查,如下所示:

if (p.IsEmpty)  p.Color = Color.Empty;
else ..

推荐阅读