我正在尝试绘制一组数据点(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}
和列代表我想要绘制x
的y
点的位置。接下来的三列RED
、GREEN
和对应于格式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 code
和post 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 代码来定义符号 - 在我们的例子中是颜色三元组。