foreach loop
我在使用和时遇到问题intersection
。
我的 MWE 如下所示:
\documentclass[border=5pt,tikz]{standalone}
\usepackage{pgfplots}
\usepackage{tikz}
\usepackage{pgfplotstable}
\pgfplotsset{compat=newest}
\usetikzlibrary{calc}
\usetikzlibrary{intersections}
\begin{document}
\def\height{10cm}
\def\width{10cm}
\def\sc{0.8}
\def\xmin{0}
\def\xmax{5}
\def\ymin{0}
\def\ymax{40000}
\def\enlarge{0.05}
\def\Gda{12244}
\def\Gdb{4773.48}
\def\Gdc{1861} % Gdb/Gda*Gdb
\def\Gpa{15526.95}
\def\Gpb{6053.38} % Gdb/Gda*Gpb
\def\aa{1.87}
\def\ab{1.76}
\def\ac{1.66} % ab/aa*ab
\def\reqa{2.67}
\def\reqb{2.97}
\def\reqc{3.30} % reqb/reqa*reqb
\begin{tikzpicture}
\begin{axis}[
height=\height,
width=\width,
scale only axis=true,
scale=\sc,
enlarge x limits=\enlarge,
enlarge y limits=\enlarge,
samples=500,
domain=\xmin:\xmax,
restrict y to domain=\ymin:\ymax,
xlabel=$\mathrm{R}$,
ylabel=$\mathrm{E(R)}$,
]
\addplot[
name path global=A,
color=black,
smooth,
]
(x,{\Gda*(1-exp(-\aa*(x-\reqa)))^2});
\addplot[
color=black,
smooth,
]
(x,{\Gpa+\Gdb*(1-exp(-\ab*(x-\reqb)))^2});
\addplot[
color=black,
smooth,
]
(x,{\Gpa+\Gpb+\Gdc*(1-exp(-\ac*(x-\reqc)))^2});
\foreach [evaluate=\i as \n using 216.92*(\i + 0.5) - 2.07*(\i + 0.5)^2] \i in {0,4,...,20} {%
\edef\temp{\noexpand%
% \path[name path global=B] (axis cs:\xmin,\n) -- (axis cs:\xmax,\n); % <- here is my problem
% \path[name intersections={of=A and B},];
% \coordinate (A1) at (intersection-1);
% \coordinate (B1) at (intersection-2);
% \draw[line width=0.5pt] (A1) -- (B1);
\draw (axis cs:\xmin,\n) -- (axis cs:\xmax,\n);
}\temp
}
\end{axis}
\end{tikzpicture}
\end{document}
我想在 foreach 循环中计算 y 值并在绘制的电位之间绘制一条水平线。我的猜测是,坐标和路径的名称有问题,因为我可以毫无错误地绘制线条,但不幸的是我找不到解决方案。
当前情节如下:
答案1
有趣的是,当我复制你的代码保存为 TeX 文档进行操作时,我尝试将其保存为,结果pgfplotsforeach.tex
发现我已经有一个同名文件作为答案\pgfmathsetmacro 没有设置宏。我猜你也看到了这个问题,因为你\edef\temp{...}\temp
的 中有\foreach
,看起来很像是来自那个答案。
问题实际上与该答案中的问题相同:由于pgfplots
保存命令直到环境结束axis
,因此您必须非常仔细地考虑当时会知道什么。扩展宏只是其中的一部分,您还必须考虑坐标和路径名称。幸运的是,在 foreach 循环中,有一种简单的方法可以使事物变得唯一 - 只需将循环计数器附加到名称(有一个警告:如果循环遍历小数,则应该使用count
循环中的键来获取一个整数并附加它,因为带有句点的坐标名称不是一个好主意)。
您还需要\noexpand
里面的所有路径构造命令\edef
,而不仅仅是第一个。
因此,这是您的代码的工作版本(我认为!):
\documentclass[border=5pt,tikz]{standalone}
%\url{https://tex.stackexchange.com/q/586094/86}
\usepackage{pgfplots}
\usepackage{tikz}
\usepackage{pgfplotstable}
\pgfplotsset{compat=newest}
\usetikzlibrary{calc}
\usetikzlibrary{intersections}
\begin{document}
\def\height{10cm}
\def\width{10cm}
\def\sc{0.8}
\def\xmin{0}
\def\xmax{5}
\def\ymin{0}
\def\ymax{40000}
\def\enlarge{0.05}
\def\Gda{12244}
\def\Gdb{4773.48}
\def\Gdc{1861} % Gdb/Gda*Gdb
\def\Gpa{15526.95}
\def\Gpb{6053.38} % Gdb/Gda*Gpb
\def\aa{1.87}
\def\ab{1.76}
\def\ac{1.66} % ab/aa*ab
\def\reqa{2.67}
\def\reqb{2.97}
\def\reqc{3.30} % reqb/reqa*reqb
\begin{tikzpicture}
\begin{axis}[
height=\height,
width=\width,
scale only axis=true,
scale=\sc,
enlarge x limits=\enlarge,
enlarge y limits=\enlarge,
samples=500,
domain=\xmin:\xmax,
restrict y to domain=\ymin:\ymax,
xlabel=$\mathrm{R}$,
ylabel=$\mathrm{E(R)}$,
]
\addplot[
name path global=A,
color=black,
smooth,
]
(x,{\Gda*(1-exp(-\aa*(x-\reqa)))^2});
\addplot[
color=black,
smooth,
]
(x,{\Gpa+\Gdb*(1-exp(-\ab*(x-\reqb)))^2});
\addplot[
color=black,
smooth,
]
(x,{\Gpa+\Gpb+\Gdc*(1-exp(-\ac*(x-\reqc)))^2});
\foreach [evaluate=\i as \n using 216.92*(\i + 0.5) - 2.07*(\i + 0.5)^2] \i in {0,4,...,20} {%
\edef\temp{\noexpand%
\path[name path global=B-\i] (axis cs:\xmin,\n) -- (axis cs:\xmax,\n); % <- here is my problem
\noexpand\path[name intersections={of=A and B-\i},];
\noexpand\coordinate (A1-\i) at (intersection-1);
\noexpand\coordinate (B1-\i) at (intersection-2);
\noexpand\draw (axis cs:\xmin,\n) -- (axis cs:\xmax,\n);
\noexpand\draw[red,line width=0.5pt] (A1-\i) -- (B1-\i);
}\temp
}
\end{axis}
\end{tikzpicture}
\end{document}
我放大了相关部分,并用红色标出线条以使其更明显。