我有以下代码,其中立方体标记的大小设置为循环\x
内foreach
:
\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 可能会相当复杂。