我有一个 CSV 文件,其中包含不同的绘图数据集 (x1,y1,z1),...,(xn,yn,zn) 和一些附加数据,其中一个我将用作图例。
我当前的代码如下:
\documentclass{article}
\usepackage{pgfplotstable,pgfplots,tikz}
\pgfplotstableread[col sep=comma,display columns/setting/.style=string type]{
x0,y0,z0,x1,y1,z1,plotID,setting
-1,2,0.149858,-1,6,0.582841,1,asdasd
-1,8,0.447147,-1,9,0.548643,2,test
}\table
\begin{document}
\begin{tikzpicture}
\begin{axis}
\pgfplotstablegetcolsof\table
\pgfmathsetmacro{\plots}{(\pgfplotsretval-2)/3-1}
\pgfplotsinvokeforeach{0,...,\plots} {
\addplot table[x=x#1,y=z#1] {\table};
\pgfplotstablegetelem{#1}{setting}\of{\table}
%\edef\bla{\pgfplotsretval}
%\def\bla{\pgfplotsretval}
\xdef\bla{\pgfplotsretval}
\addlegendentry{\bla};
}
\end{axis}
\end{tikzpicture}
\end{document}
绘图似乎运行良好,但是添加图例会带来一些麻烦。根据我是否使用\def
或\edef
\xdef
直接\pgfplotsretval
使用\addlegendentry
,我要么得到什么,要么只test
得到图例。但是,它应该只显示asdasd
在第一个图中和test
第二个图中。
正确的做法是什么?
答案1
自哈勃发现以来,我们知道宇宙正在膨胀,宇宙也在膨胀pgfplots
。标准技巧处理这个问题:
\edef\temp{\noexpand\addlegendentry{\pgfplotsretval};}
\temp
表示 中的\temp
\addlegendentry
尚未展开,但\pgfplotsretval
已展开。因此,当循环第一次运行时,\temp
将是\addlegendentry{asdasd}
。调用\temp
now 将设置相应的图例条目。
\documentclass{article}
\usepackage{pgfplotstable,pgfplots,tikz}
\pgfplotstableread[col sep=comma,display columns/setting/.style=string type]{
x0,y0,z0,x1,y1,z1,plotID,setting
-1,2,0.149858,-1,6,0.582841,1,asdasd
-1,8,0.447147,-1,9,0.548643,2,test
}\table
\begin{document}
\begin{tikzpicture}
\begin{axis}
\pgfplotstablegetcolsof\table
\pgfmathsetmacro{\plots}{(\pgfplotsretval-2)/3-1}
\pgfplotsinvokeforeach{0,...,\plots} {
\addplot table[x=x#1,y=z#1] {\table};
\pgfplotstablegetelem{#1}{setting}\of{\table}
\edef\temp{\noexpand\addlegendentry{\pgfplotsretval};}
\temp
}
\end{axis}
\end{tikzpicture}
\end{document}