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 min
或point meta max
两者之一。调色板似乎以直接的方式使用。
答案2
使用point meta min
和point 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
。