我正在尝试实现改进的彩色图,以增加我的图表和图形中的数据密度(如展望信息作者 Edward Tufte),经过大量搜索,我发现了一种我认为是生成用于显示科学信息的彩色图的优化方法,其描述如下Kenneth Moreland 在本文。只需使用他在论文中列出的 33 个 RGB 坐标,就可以轻松实现他最重要的彩色图(红白蓝,非常适合显示相对温度曲线)的简化版本,这就是我在这里展示的:
\documentclass{standalone}
\usepackage{pgfplots}
\begin{document}
\pgfplotsset{
% define the custom colormap
colormap={temp colormap}{
% RGB Coordinates, % Scalar Band Number
rgb255=(59, 76, 192),% 0.0 1
rgb255=(68, 90, 204),% 0.03125 2
rgb255=(77, 104, 215),%0.0625 3
rgb255=(87, 117, 225),%0.09375 4
rgb255=(98, 130, 234),%0.125 5
rgb255=(108, 142, 241),%0.15625 6
rgb255=(119, 154, 247),%0.1875 7
rgb255=(130, 165, 251),%0.21875 8
rgb255=(141, 176, 254),%0.25 9
rgb255=(152, 185, 255),%0.28125 10
rgb255=(163, 194, 255),%0.3125 11
rgb255=(174, 201, 253),%0.34375 12
rgb255=(184, 208, 249),%0.375 13
rgb255=(194, 213, 244),%0.40625 14
rgb255=(204, 217, 238),%0.4375 15
rgb255=(213, 219, 230),%0.46875 16
rgb255=(221, 221, 221),%0.5 17
rgb255=(229, 216, 209),%0.53125 18
rgb255=(236, 211, 197),%0.5625 19
rgb255=(241, 204, 185),%0.59375 20
rgb255=(245, 196, 173),%0.625 21
rgb255=(247, 187, 160),%0.65625 22
rgb255=(247, 177, 148),%0.6875 23
rgb255=(247, 166, 135),%0.71875 24
rgb255=(244, 154, 123),%0.75 25
rgb255=(241, 141, 111),%0.78125 26
rgb255=(236, 127, 99),%0.8125 27
rgb255=(229, 112, 88),%0.84375 28
rgb255=(222, 96, 77),%0.875 29
rgb255=(213, 80, 66),%0.90625 30
rgb255=(203, 62, 56),%0.9375 31
rgb255=(192, 40, 47),%0.96875 32
rgb255=(180, 4, 38),%1.0 33
},
}
\begin{tikzpicture}
\begin{axis}[
hide axis,
scale only axis,
height=0pt,
width=0pt,
colormap name=temp colormap,
colorbar sampled,
colormap access=piecewise const, % add this
colorbar horizontal,
point meta min=1,
point meta max=33,
colorbar style={
xlabel={Relative Temperature},
samples=33,
height=0.5cm,
width=10cm,
xtick style={
color=black}
},
]
\addplot [draw=none] coordinates {(0,0)};
\end{axis}
\end{tikzpicture}
\end{document}
输出结果如下:
然而,一个更通用的解决方案会更好。我认为有两种方法可以实现这种改进:
如果可以指定渐变数就更好了,这样非常密集的数据集就可以使用超过提供的 33 个级别。我相信应该可以编写一个插值函数来将 33 个数据点扩展为任意数字,但我不确定如何处理这个问题,特别是因为所讨论的 RGB 值以非线性方式变化。
如果可以使用任意颜色端点作为颜色图的“红色”和“蓝色”端,那就太好了。这需要实现我链接的论文中 Moreland 描述的 MSH 颜色空间转换和算法。这远远超出了我的能力范围,以至于我甚至无法发布一个最小的工作示例。但是,由于 LaTeX 是图灵完备的,因此理论上应该是可能的。
需要说明的是,我最感兴趣的是 (1) 中要求的更简单的非线性插值方法,这种方法目前完全可以满足我的需求,但我认为我会发布选项 (2),作为一个有趣的,甚至有趣的挑战,供那些可能也对使用最佳色彩空间感兴趣并且比我更熟练的人使用。在 LaTeX 中实现 MSH 转换和色彩空间将使任何新的颜色映射都可以轻松地同时进行:
- 产生美观的图像。
- 具有最大的感知分辨率。
- 尽量减少对 3D 表面阴影的干扰。
- 对视力缺陷不敏感。
- 对所有人来说,颜色顺序直观上都是相同的。
- 具有与地图的底层标量相匹配的感知插值。
任何能够编写出实现所有这些功能的代码的人都会成为许多使用颜色定期显示定量信息的科学家的英雄!