c# - 图表 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,如果我没有“恢复默认颜色”,那么当我取消隐藏它们时,它们会保持隐藏状态,并且图表的行为就像我想要的那样。
解决方案
这肯定看起来像 MSChart 中的一个错误。
但如果你没看错,背后可能有一定的逻辑。
似乎正在发生的事情是这样的:图表显示的empty DataPoints
不是它们的实际 y 值,而是它们之前的最后一个非空点之一。
结果看起来很傻,所以在你的情况下它是一个错误。Otoh,您使用该IsEmpty
属性的方式不是为了:它旨在将数据的某些部分标记为“缺失”;因此它假定这些点无论如何都没有有效的y 值。但是对于许多图表类型,这可能会导致奇怪的结果,因此它会保留最后一个有效值..
一个典型的例子是包含每日数据但在周末没有有意义数据的图表。如果遗漏了丢失的数据,有些东西将不起作用,因此插入空的虚拟点。(事实上,甚至还有一个函数可以做到这一点。)
(请注意,这只是我的解释,而不是记录在案的功能!)
这不会导致您看到有趣的显示,因为您已将 设置EmptyPointStyle.Color
为Transparent
。但是:现在您更改所有点的颜色,这会覆盖系列样式的颜色,瞧:有趣的显示..:
解决方案:
Rescale
您可以在函数中添加一行代码以在Transparent
单个基础上再次创建点,然后从UnHide
代码中调用它。(*)或者您可以完全停止(ab)使用该
IsEmpty
属性并通过将它们的颜色设置为透明来直接“隐藏”点。
(*) 另请注意链接中的引用:您始终可以通过将(系列和)数据点颜色属性设置为 Color.Empty 来切换回使用调色板颜色。(我的括号)
更新(*):我认为进行着色的最佳方法是对IsEmpty
属性进行检查,如下所示:
if (p.IsEmpty) p.Color = Color.Empty;
else ..
推荐阅读
- python - Python 3 - 计算文本文档中的字母/单词/快速问题
- android - CoordinatorLayout + AppBarLayout + 透明状态栏
- javascript - Firebase 函数:TypeError:无法读取未定义的属性“替换”
- javascript - 如何在链接中写属性?
- haskell - 免费的单子也适用吗?
- javascript - 从 JSON 对象创建 JavaScript 类
- python - 尝试将日期和时间附加到文件名
- dart - 如何在 Flutter 应用中实现支付?
- scheme - 为什么球拍宏的 lambda 没有返回任何内容?
- java - 如何在java中打印jtable的完整数据