如何使用 pgfplots 绘制散点,颜色由表 rgb 值定义?

如何使用 pgfplots 绘制散点,颜色由表 rgb 值定义?

我正在尝试绘制一组数据点(scatter彼此不相连的点),其中每个点都有不同的颜色。颜色定义由rgb写入包含数据的同一文件中的预定义值给出。

以下文件作为示例:

\usepackage{filecontents}
\begin{filecontents}{test.dat}
    x   y   RED   GREEN   BLUE
    1   11  0.2    0.3    0.5
    2   14  0.3    0.3    0.4
    4   26  0.1    0.8    0.1
    3   39  0.0    0.1    0.9
\end{filecontents}

和列代表我想要绘制xy点的位置。接下来的三列REDGREEN和对应于格式BLUE中的相关颜色值。rgb

到目前为止,我一直在尝试做的事情是:

\begin{document}

\pgfplotstableread{test.dat}\test
%number of points to be plotted
\pgfplotstablegetrowsof{\test}
\pgfmathsetmacro{\N}{\pgfplotsretval-1}  

\begin{tikzpicture}
\begin{axis}[%
    xmin=0, xmax=5,
    ymin=0, ymax=45,
    width=8cm,
    height=6cm,
    grid=both,
    xlabel=Xtest, 
    ylabel=Ytest,   
    ]
    \foreach \i in {0,...,\N}
    {
    \definecolor{testcolor}{rgb}{\thisrow{3}, \thisrow{4}, \thisrow{5}}   
    \addplot[scatter, 
        only marks,     
        scatter/use mapped color={draw=none,fill=testcolor},
    ] 
    table [x index = 0,y index = 1]{\test};
    }
\end{axis}
\end{tikzpicture}

\end{document}

但我无法获取颜色定义的单行值。我该怎么做?我也查看了meta选项,但颜色是用单个值(线性)定义的,而我需要颜色定义中的三个组件。

答案1

虽然可以通过 访问表格元素\pgfplotstablegetelem{0}{RED}\of{\test},但我建议将定义颜色的代码移到\addplot命令中:pgfplots 支持高级scatter绘图,您可以在其中定义如何绘制每个散点。这在 TeX 中更有效。

解决方案可能是

\documentclass{standalone}

\usepackage{pgfplots}

\pgfplotsset{compat=1.9}

\begin{document}

\begin{tikzpicture}
\begin{axis}[%
    xmin=0, xmax=5,
    ymin=0, ymax=45,
    width=8cm,
    height=6cm,
    grid=both,
    xlabel=Xtest, 
    ylabel=Ytest,   
    ]
    \addplot[
        scatter,%
        scatter/@pre marker code/.code={%
            \edef\temp{\noexpand\definecolor{mapped color}{rgb}{\pgfplotspointmeta}}%
            \temp
            \scope[draw=mapped color!80!black,fill=mapped color]%
        },%
        scatter/@post marker code/.code={%
            \endscope
        },%
        only marks,     
        mark=*,
        point meta={TeX code symbolic={%
            \edef\pgfplotspointmeta{\thisrow{RED},\thisrow{GREEN},\thisrow{BLUE}}%
        }},
    ] 
    table {
    x   y   RED   GREEN   BLUE
    1   11  0.2    0.3    0.5
    2   14  0.3    0.3    0.4
    4   26  0.1    0.8    0.1
    3   39  0.0    0.1    0.9
    };
\end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

我曾经\addplot table {<inline data>};减少过代码量(不过这相当于\addplot ... table {\test};)。关键点是:

  • 我添加了mark=*因为scatter不一定会分配一个情节标记作为默认值。
  • 我使用键pre marker codepost marker code来定义颜色。这与默认实现的工作方式完全相同scatter。在我们的例子中,我使用了\definecolor{rgb}{\pgfplotspointmeta},假设\pgfplotspointmeta包含某种内容<R>,<G>,<B>
  • 最后,复杂的表达式以预期的方式point meta定义。\pgfplotspointmeta
  • 请注意,我们不能简单地插入\thisrow{RED},...\definecolor这里:仅在遍历表的行时\thisrow有效- 并且它在调查输入坐标时只执行一次。pgfplots
  • 宏的\edef意思是“扩展定义”:\edef\temp{...}定义\temp包含扩展的参数。\noexpand意味着不是在此上下文中展开以下宏。
  • point meta={TeX code symbolic={<code which defines \pgfplotspointmeta}}允许我们注入一些 TeX 代码来定义符号 - 在我们的例子中是颜色三元组。

相关内容