我知道如何使用块保存pic
s\tikzset{fig/.pic={code={...
以及如何将它们插入tikzpictures
。这在重用元素时非常方便。不幸的是,我不知道如何将这种方法应用于环境pgfplots
内的元素axis
。
所需语法:
\begin{tikzpicture}
\begin{axis}
\pic{plot1};
\end{axis}
\end{tikzpicture}
\begin{tikzpicture}
\begin{axis}
\pic{plot1};
\pic{plot2};
\end{axis}
\end{tikzpicture}
其中plot1
和plot2
是在同一文档的\addplot
不同部分中重复使用的元素。这对于创建类似动画的文档非常有用(使用类中的选项,tikzpictures 会出现在单独的页面上)。我甚至可以创建循环。tikzpictures
class=article
standalone
可供参考的示例代码:
\documentclass[class=article,tikz,border=5pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\pgfplotsset{%
xmin=0,
xmax=1,
ymin=0,
ymax=1,
xlabel={$x$},
ylabel={$y$},
}%
% PLOTS WITH THEIR AXES (NOT THE SYNTAX I WANT)
\tikzset{fig/.pic={code={%
\begin{axis}
\addplot [color=blue, domain=0:1] expression {x};
\addplot [color=red, domain=0:1] expression {1-x};
\end{axis}
}}}%
% PLOTS WITHOUT THEIR AXES
% Inserted the scope in the hope that it would help
\tikzset{plot1/.pic={code={%
\begin{scope}
\addplot [color=blue, domain=0:1] expression {x};
\end{scope}
}}}%
\tikzset{plot2/.pic={code={%
\begin{scope}
\addplot [color=red, domain=0:1] expression {1-x};
\end{scope}
}}}%
\begin{document}
% DESIRED OUTPUT BUT NOT DESIRED SYNTAX:
\begin{tikzpicture}
\pic{fig};
\end{tikzpicture}
% DESIRED SYNTAX BUT WILL FAIL:
\begin{tikzpicture}
\begin{axis}
\pic{plot1};
\pic{plot2};
\end{axis}
\end{tikzpicture}
\end{document}
答案1
如果您愿意,您可以设置选项和/或将其放在\newcommand
序言中。以下是我喜欢的方式:
\documentclass[border=1cm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}
\begin{document}
\begin{tikzpicture}
\newcommand{\plotI}{
\addplot [blue, domain=0:1] {x};
}
\newcommand{\plotII}{
\addplot [red, domain=0:1] {1-x};
}
\begin{axis}[
xmin=0, xmax=1,
ymin=0, ymax=1,
xlabel={$x$}, ylabel={$y$},
]
\plotI
\plotII
\end{axis}
\end{tikzpicture}
\end{document}
编辑:
要在内部循环axis
,您需要\pgfplotsinvokeforeach
和朋友 - 而不是 -foreach
请参阅手册 p.546
以下是一个例子:
\documentclass[border=1cm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}
\begin{document}
\begin{tikzpicture}
\newcommand{\plotI}[1]{
\addplot [#1, domain=0:1] {rnd*x};
}
\newcommand{\plotII}{
\addplot [orange, domain=0:1] {1-x};
}
\begin{axis}[
xmin=0, xmax=1,
ymin=0, ymax=1,
xlabel={$x$}, ylabel={$y$},
]
\pgfplotsinvokeforeach{red, green, blue}
{\plotI{#1}}
\plotII
\end{axis}
\end{tikzpicture}
\end{document}