如何在可视化中找到合适的颜色与数据值的关联?

机器算法验证 数据可视化 数据转换
2022-04-01 11:56:04

我正在开发一个软件项目,该项目涉及为洪水模拟创建可视化工具。作为该项目的一部分,我创建了一个水梯度,显示特定点的水深。为了设置代表什么颜色的值,我遍历数据并获取出现的最小值和最大值,并根据该比例均匀分布颜色。

然而,在这些模拟中,有时点处的水比模拟中的其他任何地方都要深得多。这会导致地图上的大多数点具有非常相似的颜色,并且信息量不是很大,并且很难看到水较深的区域。

我的目标是为更频繁出现的深度提供更大范围的颜色。例如,如果深度从 0 到 12,但大多数深度在 1 和 2 之间,我希望在该范围内发生比 11 和 12 或 4 和 5 之间更多的颜色变化。看来我需要使用标准偏差或一些涉及正态分布的东西来做到这一点,但我对这些东西如何工作以及如何使用它们来实现我的目标有点模糊。

可以提供的任何帮助将不胜感激。谢谢你。

2个回答

尽管@whuber 的回答提供了您所要求的内容,但我想提醒您,出于两个原因,您所问的可能不是直观表示数据的最佳方式。

  1. 观众自然会认为颜色是按值(深度)而不是按等级均匀分布的。您将不得不努力使用标签,以使观众的认知大脑推翻他们的视觉系统告诉他们的内容。
  2. 对您的观众来说,排名可能并不比实际深度更重要。例如,如果在 0 和 1 之间有很多值,那么分析这些值的分布方式是否重要?

当然,您最了解您的应用程序,所以我不能说正确的答案是什么,但下面是一些使用由

r = Sqrt((:x * :x + :y * :y) / 400);
t = ArcTan(:y, :x);
z = (12 * Exp(-r * r * 3)) * Abs(Sin(2 * Pi() * r) - r * Cos(3 * t))

数据从 0 到 12.5,分布如下:

直方图

一个 3-D 表面图显示了一些山峰、一个浅槽和一个小丘:

曲面图

现在让我们看一些二维等高线图。

直线颜色映射,它遗漏了您注意到的较小特征:

线性颜色映射

如果深层区域的变化不重要,那么剪裁颜色映射可以为较小的深度提供更多颜色,同时在该区域保持线性映射:

裁剪的线性颜色映射

为了比较,这是等级颜色的视图(抱歉,我的图例是等级值而不是深度值):

等级颜色映射

我不确定这是否可以很好地代表您的应用程序。浅槽中的细节被夸大了。日志颜色映射是相似的,并且具有一些真实解释的优点并且可以在数据集之间保持一致,但是日志仍然不是感知的(再次为图例道歉):

日志颜色映射

最后,这是一种稍微不同方向的方法,可以与上述任何方法结合以提高分辨率:多色调颜色映射。在这种情况下,着色是线性的并且被裁剪:

双削波线性

最后,我的软件不允许使用的一种方法是使用多色调分段线性颜色映射,我在一些高程图中看到过。例如,低海拔是 50 英尺增量的绿色,中海拔是 200 英尺增量的棕褐色,高海拔是 800 英尺增量的灰色。

底线:如果观众的大脑你的视觉感知系统一起工作而不是与之对抗会更好。

听起来您可能希望将调色板中的每种颜色专用于大致相同数量的数据。

为了说明,这里是一组个模拟深度读数的直方图:110

直方图

想象一下,这被平滑了。这样做,直方图可以被均匀地分割成相等面积的垂直段,使用尽可能多的切片(我在这个例子中使用片。)为了保持面积相等,切片必须在直方图所在的地方很窄高——即有大量数据的地方——直方图低的地方——即数据少的地方。10

内核密度,切片

轻松完成切片的一种方法是根据深度绘制数据总量(“累积比例”)。将垂直轴切成均匀的间隔,然后读取切片穿过绘图的深度:将其用作可视化深度的切点。

CDF

从数据中计算切点的算法应该是显而易见的,并且几乎可以用任何编程语言轻松编写:对值进行排序,将列表分成大小大致相等的组,然后选择切点以将每个组中的最大值与接替它的组中的最小值。