在 pgfplots 轴定义中使用变量或命令

在 pgfplots 轴定义中使用变量或命令

这可能是一种愚蠢的做法,但请忍耐一下。

我有一个文档,其中我定义了 lua 表中的值,以便在对它们进行一些计算后在表或 pgf 图中重复使用它们。

我的问题是,尽管这种方法似乎对几乎所有事情都有效,但是当我在 pgf 中定义我的 ybar 图并特别是值时symbolic x coords,它却无法工作,因为它无法解析此时给出的任何内容。

我起初以为这是一个directlua问题,但事实上,即使使用相同值定义的 LaTeX 命令也不起作用。

只有当我手动输入我想要的值时,文档才会编译。否则我会得到类似这样的错误

! 包 pgfplots 错误:抱歉,输入坐标“1 天”未定义为“symbolic x coords={\xcoordlabelsii }... 可能是拼写错误?或者您指的是 [normalized]1 天?之类的东西。

\documentclass[tikz]{standalone}
\usepackage{pgfplots}
\usepackage{pgf}
\pgfplotsset{compat=1.13}
\usepgfplotslibrary{units}

\directlua{
    labelset={"1 day","1 month","2 months","3 months","6 months","1 year"}
    worstcasecache = {3.40, 103.30, 206.61 ,309.91, 619.82, 1239.65 }
    bestcasecache = {0.74, 22.37, 44.74, 67.11, 134.22, 268.44}
}

\begin{document}
\begin{tikzpicture}
\newcommand{\xcoordlabelsi}{\directlua{tex.print{table.concat(labelset, " , ")}}}
\newcommand{\xcoordlabelii}{1 day,1 month,2 months,3 months,6 months,1 year}
\begin{axis}[
width = \textwidth,
height = 0.65\textwidth,
ylabel near ticks,
use units,
%x tick label style={/pgf/number format/1000 sep},
ylabel=Data volume,
y unit = B,
y unit prefix = Ti,
symbolic x coords={1 day, 1 month, 2 months, 3 months, 6 months, 1 year}, % works as expected
% symbolic x coords = \directlua{tex.print("{" .. table.concat(labelset, " , ") .. "}")}, % doesn't work
%symbolic x coords = {\xcoordlabelsi}, % doesn't work
%symbolic x coords = {\expandafter\xcoordlabelsii}, % doesn't work
%enlargelimits=0.15,
ybar,
bar width=10pt,
xtick=data,
x tick label style={rotate=45,anchor=east},
ymin = 1,
%xscale = 2,
legend style = {draw=none},
legend cell align = left,
legend pos = north west,
]
\addplot coordinates {\directlua{
    for i=1,6 do
        tex.print("(" .. labelset[i] .. "," .. bestcasecache[i]*100/1024 .. ")")
    end}
};
\addplot coordinates {\directlua{
    for i=1,6 do
        tex.print("(" .. labelset[i] .. "," .. worstcasecache[i]*100/1024 .. ")")
    end}
};

\legend{Best case, Worst case}
\end{axis}
\end{tikzpicture}
\end{document}

答案1

有些键不会执行/扩展其参数,而是立即解析它们。想象一下,您的符号标签中有一些脆弱的宏,如果您扩展它们,则会导致错误,或者其他一些情况可能会导致问题。因此,您必须提供扩展版本。

对于您定义的第二个宏,如果您实际上强制扩展宏,它就会按预期工作:

symbolic x coords/.expand once = \xcoordlabelii,

给出

在此处输入图片描述

对于第一个参数,如果你将其展开一次,就会得到数组的典型括号版本,因此 pgfplots 将其视为单个实体,我们得到

symbolic x coords/.expand once = \xcoordlabelsi,

在此处输入图片描述

我们可以进一步扩展。因此,如果您使用expand twice或,expanded您将看到它会抱怨,因为与表示空格字符a day不同。因此,您必须删除代码中的空格<_>a day<_><_>directlua

\newcommand{\xcoordlabelsi}{\directlua{tex.print{table.concat(labelset,",")}}}

然后使用

symbolic x coords/.expand twice = \xcoordlabelsi, 

它的输出与第一张图片相同。

相关内容