数据展示:请选择好的颜色映射方案

类别:    标签: 数理   阅读次数:   版权: (CC) BY-NC-SA

2014-11-20 10:16:44

在数据可视化时, 人们常常使用颜色映射图, 就是将一定范围内的数据跟一定范围内的颜色对应起来, 不同的颜色表示数据的不同大小. 这样的图在展示的时候很直观, 很清晰, 也很吸引眼球, 所以在科技论文中常常可以看到.

很多人在做颜色映射图时, 没有特别留意选用什么样的颜色范围, 颜色和数据之间以什么方式对应. 大多数人直接使用了彩虹映射图(从红到蓝的线性映射, 类似可见光颜色, 很多软件的默认设置).

这种图看起来颜色多样, 给人很漂亮的感觉. 可细究起来, 这种彩虹映射图是非常差的一种颜色映射方案, 以致于有人专门写文章指出, Rainbow Color Map (Still) Considered Harmful. 简单说来, 彩虹映射方案的主要缺陷在于颜色不均匀, 不同颜色之间过渡不平滑, 在显示数据时很容易将一些细节淹没. 更详细的讨论可参看这篇文章, Why Should Engineers and Scientists Be Worried About Color?.

既然彩虹映射方案很差, 那什么样的颜色映射方案好呢? Brewer的文章就讨论了这个问题, 并专门提供了一些好的方案供你在线选择. 在作图时, 最好使用这些好的颜色映射方案. 虽然它们看起来可能没有彩虹映射方案那么炫, 但对于正确反映数据的特征很有帮助, 而这正是科学数据可视化中最重要的一点.

有人还提出了一种被称为分散颜色映射的方案, 并证实效果不错. 这个方案的论文, 数据, 代码可以在这里找到: Diverging Color Maps for Scientific Visualization. 具体的效果也请参考论文中的对比图.

分散颜色映射方案的精确计算很复杂, 这样在使用时很不方便. 一个简单的解决方式就是将其颜色的RGB值拟合成简单的解析表达式.

根据上面网址给出的257个数据点(文件CoolWarmFloat257.csv), 我发现对红色R和蓝色B可以很好的利用高斯函数进行拟合, 对于绿色G, 我没有找到合适的单一解析表达式, 而只能以 $x=0.5$ 为分割点, 进行分段拟合, 前半段采用高斯函数, 后半段采用二次函数, 效果也还不错.

拟合采用的函数形式如下

\[\begin{align} \text{Gauss}(y_0, A, x_0, w, x) &= y_0+A \exp\left(-{(x-x_0)^2 \over 2w^2}\right) \\ \text{Circle}(y_0, a, b, x_0, x) &=y_0+b\sqrt{1-{(x-x_0)^2 \over a^2}} \end{align}\]

下面是论文中给出的冷暖方案及其数据

x         R   G   B   RGB
0.0       59  76 192 #3B4CC0
0.03125   68  90 204 #445ACC
0.0625    77 104 215 #4D68D7
0.09375   87 117 225 #5775E1
0.125     98 130 234 #6282EA
0.15625  108 142 241 #6C8EF1
0.1875   119 154 247 #779AF7
0.21875  130 165 251 #82A5FB
0.25     141 176 254 #8DB0FE
0.28125  152 185 255 #98B9FF
0.3125   163 194 255 #A3C2FF
0.34375  174 201 253 #AEC9FD
0.375    184 208 249 #B8D0F9
0.40625  194 213 244 #C2D5F4
0.4375   204 217 238 #CCD9EE
0.46875  213 219 230 #D5DBE6
0.5      221 221 221 #DDDDDD
0.53125  229 216 209 #E5D8D1
0.5625   236 211 197 #ECD3C5
0.59375  241 204 185 #F1CCB9
0.625    245 196 173 #F5C4AD
0.65625  247 187 160 #F7BBA0
0.6875   247 177 148 #F7B194
0.71875  247 166 135 #F7A687
0.75     244 154 123 #F49A7B
0.78125  241 141 111 #F18D6F
0.8125   236 127  99 #EC7F63
0.84375  229 112  88 #E57058
0.875    222  96  77 #DE604D
0.90625  213  80  66 #D55042
0.9375   203  62  56 #CB3E38
0.96875  192  40  47 #C0282F
1.0      180   4  38 #B40426

拟合结果

\[\alg &R: 255 \times \text{Gauss}( 0.00973, 0.95734, 0.68447, 0.40538, x) \\ &G: \begin{cases} 255 \times \text{Gauss}( -0.70487, 1.57141, 0.51782, 0.54700, x)\; &x \in [0,0.5] \\ 255 \times \text{Circle}(-0.97384, 0.96412, 1.96264, 0.17749, x)\; &x \in (0.5,1.0] \end{cases}\\ &B: 255 \times \text{Gauss}( -0.05837, 1.05992, 0.28797, 0.39754, x) \ealg\]

拟合效果图

可见拟合效果相当不错, 展示数据时人眼觉察不到解析式效果与精确值效果之间的差异.

这种拟合解析式的方法可以同样运用到论文中给出的其他颜色方案.

更普遍的, 或许能直接给出任意方案的近似解析式. 我没有那么多时间, 有兴趣的人可以试着推广一下. 若得到了肯定的答案, 还烦请告知我.

◆本文地址: , 转载请注明◆
◆评论问题: https://jerkwin.herokuapp.com/category/3/博客, 欢迎留言◆


前一篇: Hamaker方程
后一篇: Linux服务器映射为本地硬盘

访问人次(2015年7月 9日起): | 最后更新: 2024-01-20 10:40:28 UTC | 版权所有 © 2008 - 2024 Jerkwin