在 pgfplots 中实现 Moreland 平衡色彩图

在 pgfplots 中实现 Moreland 平衡色彩图

我正在尝试实现改进的彩色图,以增加我的图表和图形中的数据密度(如展望信息作者 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}

输出结果如下:

Colormaps.tex 的输出

然而,一个更通用的解决方案会更好。我认为有两种方法可以实现这种改进:

  1. 如果可以指定渐变数就更好了,这样非常密集的数据集就可以使用超过提供的 33 个级别。我相信应该可以编写一个插值函数来将 33 个数据点扩展为任意数字,但我不确定如何处理这个问题,特别是因为所讨论的 RGB 值以非线性方式变化。

  2. 如果可以使用任意颜色端点作为颜色图的“红色”和“蓝色”端,那就太好了。这需要实现我链接的论文中 Moreland 描述的 MSH 颜色空间转换和算法。这远远超出了我的能力范围,以至于我甚至无法发布一个最小的工作示例。但是,由于 LaTeX 是图灵完备的,因此理论上应该是可能的。

需要说明的是,我最感兴趣的是 (1) 中要求的更简单的非线性插值方法,这种方法目前完全可以满足我的需求,但我认为我会发布选项 (2),作为一个有趣的,甚至有趣的挑战,供那些可能也对使用最佳色彩空间感兴趣并且比我更熟练的人使用。在 LaTeX 中实现 MSH 转换和色彩空间将使任何新的颜色映射都可以轻松地同时进行:

  • 产生美观的图像。
  • 具有最大的感知分辨率。
  • 尽量减少对 3D 表面阴影的干扰。
  • 对视力缺陷不敏感。
  • 对所有人来说,颜色顺序直观上都是相同的。
  • 具有与地图的底层标量相匹配的感知插值。

任何能够编写出实现所有这些功能的代码的人都会成为许多使用颜色定期显示定量信息的科学家的英雄!

相关内容