C# 图表xAxis中意外的副作用设置点颜色

C# 图表xAxis中意外的副作用设置点颜色,c#,charts,C#,Charts,我正在使用point.IsEmpty隐藏图表中的某些点(异常值)。我有这个工作很好,但我注意到一些奇怪的事情。如果恢复图表颜色,则当点隐藏或取消隐藏时,它会显示在不同的位置。我甚至不需要恢复颜色;如果我只是获取并存储相同的颜色值,就会产生副作用 Color c = SavedColoredPoints[i].Color;; foreach (DataPoint p in ChartScatter.Series[i].Points) { Debug.Assert(!p.Color.IsE

我正在使用
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;
我在微软也读过一篇关于设置点颜色的老博客:

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


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

这当然看起来像MSChart中的一个bug

但是如果你正确看待它,它背后可能有某种逻辑

似乎是这样的:图表显示的是一个
空数据点
,不是它们的实际y值,而是它们前面的最后一个非空

结果看起来很愚蠢,因此在您的情况下,它是一个bug。Otoh,您使用
IsEmpty
属性的方式是而不是什么是的意思:它是指将数据的某些部分标记为“缺失”;因此,它假定这些点无论如何都没有有效的y值。但对于许多图表类型,这可能会导致奇怪的结果,因此会带上最后一个有效值

一个典型的例子是有每日数据但周末没有有意义数据的图表。如果遗漏了缺少的数据,则某些操作将不起作用,因此将插入空的虚拟点。(事实上,甚至有一个函数可以做到这一点。)

(请注意,这只是我的解释,不是文档化的功能!)

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

解决方案:

  • 您可以在
    重缩放
    函数中添加一行代码,以使点在单个基础上再次透明,然后从
    取消隐藏
    代码中调用它。(*)

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

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

Update(*):我认为最好的着色方法是检查
IsEmpty
属性,如下所示:

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

这显然看起来像MSChart中的一个bug

但是如果你正确看待它,它背后可能有某种逻辑

似乎是这样的:图表显示的是一个
空数据点
,不是它们的实际y值,而是它们前面的最后一个非空

结果看起来很愚蠢,因此在您的情况下,它是一个bug。Otoh,您使用
IsEmpty
属性的方式是而不是什么是的意思:它是指将数据的某些部分标记为“缺失”;因此,它假定这些点无论如何都没有有效的y值。但对于许多图表类型,这可能会导致奇怪的结果,因此会带上最后一个有效值

一个典型的例子是有每日数据但周末没有有意义数据的图表。如果遗漏了缺少的数据,则某些操作将不起作用,因此将插入空的虚拟点。(事实上,甚至有一个函数可以做到这一点。)

(请注意,这只是我的解释,不是文档化的功能!)

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

解决方案:

  • 您可以在
    重缩放
    函数中添加一行代码,以使点在单个基础上再次透明,然后从
    取消隐藏
    代码中调用它。(*)

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

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

Update(*):我认为最好的着色方法是检查
IsEmpty
属性,如下所示:

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

序列IsXValueIndexed了吗?如何添加点?不做任何不寻常的事情,没有索引。如果这个问题以前从未出现过,我可以用t