PGFplots:使用“colormap access=direct”进行散点图会导致 PGF 数学错误

PGFplots:使用“colormap access=direct”进行散点图会导致 PGF 数学错误

pgfplots我想使用属于不同类别的点来制作散点图。点颜色应通过数据中的类别列来确定,该类别列指的是颜色图中的索引。

\documentclass[margin=10pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}

\begin{document}
\begin{tikzpicture}

\pgfplotsset{colormap={mymap}{
rgb=(0.8,0.0,0.0)
rgb=(0.0,0.8,0.0)
rgb=(0.0,0.0,0.8)
}}

    \begin{axis}
        \addplot [
            scatter,
            mark=*,
            only marks,
            point meta=\thisrowno{2},
            % colormap access=direct   % NB
        ] table {
            0 0 0
            1 1 1
            2 2 0
        };

    \end{axis}
\end{tikzpicture}

\end{document}

到目前为止,颜色映射的作用是线性映射。这意味着:

  • 外部点呈现红色(最低元值 => 最低颜色值)
  • 内部点呈现蓝色(最高元值 => 最高颜色值)

我想使用颜色图作为调色板,这样我就可以直接指定使用的颜色,无论其他点的元值如何:

  • 外部点应呈现红色(元值 0 => 从颜色图中选取颜色 0)
  • 内部点应呈现绿色(元值 1 => 从颜色图中选取颜色 1)

文档中包含一个示例(“Lena”图像),使用colormap access=direct。看来这正是所需要的:

选择“直接”不执行任何转换;它将的值解释point meta为当前颜色图中的整数索引。

但是,当我激活时,出现以下错误:

软件包 PGF 数学错误:无法将输入“0.8,0.0,0.0”解析为浮点数,抱歉。不可读部分位于“,0.0,0.0”附近。

还有一系列其他错误,包括Runaway argument?,但我认为它们属于根本错误。

colormap access=direct如果注释掉,则不会发生错误。问题发生在 TeX Live 2019 上的 pdflatex、lualatex 上;我也在 Overleaf 上运行了这个,它在 TeX Live 2020 上使用 pdflatex,导致了同样的错误。


我想到了一个解决方法:自己将数据分成不同的类,\addplot每个类使用一个,分别指定相应的颜色。这似乎很麻烦。

您知道为什么会出现错误吗?我做错了什么吗?

答案1

不要问我太多原因,但在阅读pgfplots手册并试图找出您的示例不起作用的原因后,我发现colormap access=direct如果使用,则在这里可以正常工作\addplot[point meta=explicit symbolic, ...] table[meta index=2] ...。使用explicit而不是explicit symbolic会带来与您的示例相同的错误。我觉得这有点奇怪,因为在matrix plot手册中用于说明的示例中colormap access=direct(请参阅第节使用颜色图作为索引颜色空间(调色板)Revision 1.17 (2020/02/29)在手册的第 236 页),点 meta 被视为数值上point meta=explicit。似乎 的scatter处理point meta方式与 不同matrix plot

\documentclass[tikz,border=2mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}

\begin{document}
\begin{tikzpicture}

\pgfplotsset{colormap={mymap}{
  rgb=(0.8,0.0,0.0)
  rgb=(0.0,0.8,0.0)
  rgb=(0.0,0.0,0.8)
}}

\begin{axis}
    \addplot [
        scatter,
        mark=*,
        only marks,
        point meta=explicit symbolic,
        colormap access=direct,
    ] table[meta index=2] {
        0 0 0
        1 1 1
        2 2 0
    };
\end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

请注意,此解决方案不需要在颜色图定义中提供索引:它确实会产生

0 0.8 0 RG

对于 PDF 流的中间点,没有任何需要使用以下语法您的答案

rgb(0)=(0.8,0.0,0.0)
rgb(1)=(0.0,0.8,0.0)
rgb(2)=(0.0,0.0,0.8)

没有必要提供point meta minpoint meta max两者之一。调色板似乎以直接的方式使用。

答案2

使用point meta minpoint meta max键,我们可以扩展使用的颜色索引的范围,从而为我们提供一个独立于数据中实际出现的元值的映射。这意味着中间点实际上呈现为绿色:

\documentclass[margin=10pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}

\begin{document}
\begin{tikzpicture}

\pgfplotsset{colormap={mymap}{
rgb=(0.8,0.0,0.0)
rgb=(0.0,0.8,0.0)
rgb=(0.0,0.0,0.8)
}}

    \begin{axis}
        \addplot [
            scatter,
            mark=*,
            only marks,
            point meta=\thisrowno{2},
            point meta min=0,
            point meta max=2, % the max color of the colormap
        ] table {
            0 0 0
            1 1 1
            2 2 0
        };

    \end{axis}
\end{tikzpicture}

\end{document}


我们可以将其留在这里,但检查生成的 PDF 会发现中间点的绿色略有错误:

0.00004 0.79995 0 rg

使用色彩图坐标有助于实现这一点:

\pgfplotsset{colormap={mymap}{
rgb(0)=(0.8,0.0,0.0)
rgb(1)=(0.0,0.8,0.0)
rgb(2)=(0.0,0.0,0.8)
}}

给予我们:

0 0.8 0 RG

请注意,即使与 结合,最后的添加本身(使用颜色图坐标)也不能解决原始问题colormap access=direct

相关内容