pgfplots:使用 \foreach 生成的列表作为符号坐标

pgfplots:使用 \foreach 生成的列表作为符号坐标

我想使用 pgfplots 创建一些条形图。每个图表都有类似的格式,但有一些不同的标签和值。我正在尝试创建一个命令,该命令将从此输入数据生成我的图表。例如,我希望能够键入\drawchart{Foo/10, Bar/20}并让它生成适当的条形图。我无法接受此输入“Foo/10, Bar/20”并将其转换为可以使用的列表“Foo,Bar” symbolic coords。这是一个不起作用的 MWE:

\documentclass{article}
\usepackage{tikz, pgfplots}
\pgfplotsset{compat=1.9}

\def\lab{Foo,Bar}
\let\labb\lab

\def\ylabelscmd{\foreach \label/\val in {Foo/1,Bar/2} {{\label},}}
\global\let\ylabels\ylabelscmd


\begin{document}
\ylabelscmd --- \ylabels
\begin{figure}[htb]
    \centering
    \begin{tikzpicture}
        \begin{axis}[
            xbar,
            %symbolic y coords/.expand once = {\lab}, % works
            %symbolic y coords/.expand once = {\labb}, % works
            %symbolic y coords/.expand once = {\ylabelscmd}, % error: ! Missing \endcsname inserted.
            symbolic y coords/.expand once = {\ylabels}, % error: ! Missing \endcsname inserted.
            ytick = data,
            ]
            \addplot+ coordinates { (1,Foo) (2,Bar) };
        \end{axis}
    \end{tikzpicture}
\end{figure}

\end{document}

出于某种原因,如果命令是symbolic coords硬编码列表,它会起作用,但如果我使用它生成它,\foreach它会报错。正如您在代码中看到的,我尝试使用\let和使用它来评估命令,但似乎没有什么区别(至少对于选项来说expand once)。

有任何想法吗?

答案1

我猜您想要的只是将符号坐标列表存储在 中\ylabels。为了实现这一点,您可以\xdef像下面的代码一样使用。 在此处输入图片描述

\documentclass{article}
\usepackage{pgffor,tikz, pgfplots}
\pgfplotsset{compat=1.9}

\def\lab{Foo,Bar}
\let\labb\lab

% use this to store the result of your for loop to \ylabelscmd
\def\ylabelscmd{}
\foreach \label/\val in {Foo/1,Bar/2}{\xdef\ylabelscmd{\ylabelscmd,\label}}

\global\let\ylabels=\ylabelscmd


\begin{document}
\ylabelscmd --- \ylabels

\begin{figure}[htb]
    \centering
    \begin{tikzpicture}
        \begin{axis}[
            xbar,
            %symbolic y coords/.expand once = {\lab}, % works
            %symbolic y coords/.expanded = {\labb}, % works
            %symbolic y coords/.expand once = {\ylabelscmd}, % error: ! Missing \endcsname inserted.
            symbolic y coords/.expand once={\ylabels}, % error: ! Missing \endcsname inserted.
            ytick = data,
            ]
            \addplot+ coordinates { (1,Foo) (2,Bar) };
        \end{axis}
    \end{tikzpicture}
\end{figure}

\end{document}

相关内容