我想使用 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}