如何在 pgfplots 中的 tick 定义中使用宏

如何在 pgfplots 中的 tick 定义中使用宏

考虑以下代码:

\documentclass[border=2pt]{standalone}

\usepackage{pgfplots}

\newcommand\myxtick[1]{\foreach \x in {2,3,4}{\x,}#1}
\newcommand\otherxtick{2,3,4,5}

\begin{document}  
\begin{tikzpicture}
    \begin{axis}[
        %xtick={\myxtick[5]},
        xtick={\otherxtick},
        xmax=10,xmin=0,ymax=10,domain=0:10]
    \addplot {x};
    \end{axis}
\end{tikzpicture}
\end{document}

如果我指定 ,xtick代码\otherxtick可以工作,但如果我使用 ,\myxtick[5]它会出现错误并且无法编译。我也尝试了xtick./expanded={\myxtick[5]}xtick./expand once={\myxtick[5]}和,xtick./expand twice={\myxtick[5]}但结果相同。

我也看了这些问题,但没有结果:

我问这个问题是因为刻度定义的符号{1,2,...,20}并不总是可用的。例如,考虑一个dateplot你想要从 1900 年到 1960 年每 3 年刻度的程序。如果我写{1900-01-01,1903-01-01,...,1960-01-01}它不起作用,写所有 21 个刻度非常无聊...

答案1

问题在于您定义列表的方式。\othertick是一个“好”列表,而 则\myxtick不是。

您需要的是一种能够创建要传递给的列表的命令xtick:要做到这一点,您必须考虑列表分隔符(逗号)的位置以及 foreach 对事物进行分组的事实,因此以这种方式创建的列表不是全局的。

一个解决方案是:

\newcommand{\deflisttick}[1]{
\gdef\listticks{}% global list
\foreach \x[count=\xi] in {#1}{\global\let\maxitems\xi}% count the max number of items
\foreach \x[count=\xi] in {#1}{
 \ifnum\xi=\maxitems
   \xdef\listticks{\listticks \x}
 \else
   \xdef\listticks{\listticks \x,}
 \fi
}
}

在这种情况下,我检查列表的最后一个元素:处理时,列表中没有添加最后的逗号(还有其他方法可以实现这一点)。

然后在文档中调用:

\deflisttick{1,3,...,9}

这将创建:1,3,5,7,9。例如:

\documentclass[border=2pt]{standalone}

\usepackage{pgfplots}

\newcommand{\deflisttick}[1]{
\gdef\listticks{}% global list
\foreach \x[count=\xi] in {#1}{\global\let\maxitems\xi}% count the max number of items
\foreach \x[count=\xi] in {#1}{
 \ifnum\xi=\maxitems
   \xdef\listticks{\listticks \x}
 \else
   \xdef\listticks{\listticks \x,}
 \fi  
}
}

\begin{document}
\deflisttick{1,3,...,9}
\begin{tikzpicture}
    \begin{axis}[
        xtick={\listticks},
        xmax=10,xmin=0,ymax=10,domain=0:10]
    \addplot {x};
    \node at (axis cs: 2,5){\listticks};% debug purposes
    \end{axis}
\end{tikzpicture}
\end{document}

相关内容