pgfplots:foreach 中的 setlength

pgfplots:foreach 中的 setlength

我有以下代码,其中立方体标记的大小设置为循环\xforeach

\begin{tikzpicture}
 \begin{axis}[axis lines=none]
  \newlength{\mylen}
  \foreach \x in {1,2,...,10} {
  \setlength{\mylen}{\x pt}
    \addplot3[only marks,scatter,mark=cube*,mark size=\mylen] coordinates {(\x*5,10*\x,3*\x)};
    };
\end{axis}
\end{tikzpicture}

这会导致出现空白的图 - 即它不起作用。

但是,如果我们将长度设置为mylen(常数)foreach 循环,它工作得很好。这可能是一个线索。有什么想法吗?

\setlength另外,我怎样才能操纵命令中的长度\setlength{\mylen}{2*\x+10 pt}

答案1

您应该使用\pgfplotsinvokeforeach{list}{command}命令来实现这一点,而不是通常的\foreach。这确保参数传递给\addplot扩展的选项,因此当实际绘制图表时(我相信这不会立即发生),它们包含正确的参数:

\documentclass{article}
\usepackage{pgfplots}

\begin{document}

\begin{tikzpicture}
 \begin{axis}[axis lines=none]
  \pgfplotsinvokeforeach{1,2,...,10} {
    \addplot3[only marks,scatter,mark=cube*,mark size=#1 pt] coordinates {(#1*5,10*#1,3*#1)};
    };
\end{axis}
\end{tikzpicture}

\end{document}

答案2

问题似乎是,该\addplot命令在遇到时不解释其选项,而仅在绘制图时才解释。这意味着不使用循环的当前值\x\mylen循环内部的值,而是使用循环之前或之后的最新值。循环内容在组内执行,因此更改不会在之后保留。

mark size=\mylen在您的情况下,所有使用\mylen默认值 0pt绘制的图。解决方案是预先手动扩展该值,然后\addplot使用扩展值调用。实际上,您不需要长度。如果您想使用它,请在部分中将其替换\x为:\the\mylen\edef

\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
 \begin{axis}[axis lines=none]
  \foreach \x in {1,2,...,10} {
        \edef\PLOT{\noexpand\addplot3[only marks,scatter,mark=cube*,mark size=\x pt]}
        \PLOT coordinates {(\x*5,10*\x,3*\x)};
    };
 \end{axis}
\end{tikzpicture}
\end{document}

下次请提供一个完整可编译但最小的示例。我pgfplots以前从未使用过,不得不猜测序言。这里结果很简单,但当需要许多库时,使用 PGF/TikZ 可能会相当复杂。

相关内容