在 pgfplotstable 中从 CSV 读取字符串

在 pgfplotstable 中从 CSV 读取字符串

我有一个 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}。调用\tempnow 将设置相应的图例条目。

\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}

在此处输入图片描述

相关内容