我正在尝试生成一个箱线图,pgfplots
其中绘制的数据是由其他命令生成的。这里是 MCVE:
\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.13}
\usetikzlibrary{pgfplots.statistics}
\newcommand{\addBoxplot}[1]{%
\begin{tikzpicture}%
\begin{axis}%
\addplot[boxplot = {average = auto}] table[row sep=\\,y index=0] {#1};%
\end{axis}%
\end{tikzpicture}%
}
\newcommand{\getData}{data\\ 1\\ 3\\}
\begin{document}
% Try 1
\addBoxplot{data\\ 1\\ 3\\ }
% Try 2
\addBoxplot{\getData}
\end{document}
尝试 1 表明该\addBoxplot
命令按预期工作。尝试 2 是我真正感兴趣的情况。这将生成一个空的箱线图,而不是像尝试 1 一样只给出相同的图。以下是我的输出:
问题似乎是\getData
评估得太晚,导致\addBoxplot
根据无效/空数据生成图表。
我怎样才能\addBoxplot
在尝试 2 的背景下实现工作?
答案1
\expandafter
可以是你最好的朋友(也可以是你最可怕的噩梦)。
在这种情况下,\addBoxplot
不想看到宏名称,它想看到实际数据,因此\getdata
必须将宏扩展一次,以便\addBoxplot
以它喜欢的形式看到参数。
\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.13}
\usetikzlibrary{pgfplots.statistics}
\newcommand{\addBoxplot}[1]{%
\begin{tikzpicture}%
\begin{axis}%
\addplot[boxplot = {average = auto}] table[row sep=\\,y index=0] {#1};%
\end{axis}%
\end{tikzpicture}%
}
\newcommand{\getData}{data\\ 1\\ 3\\}
\begin{document}
% Try 1
\addBoxplot{data\\ 1\\ 3\\ }
% Try 2
\expandafter\addBoxplot\expandafter{\getData}
\end{document}