foreach 循环和交叉点的问题

foreach 循环和交叉点的问题

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}

我放大了相关部分,并用红色标出线条以使其更明显。

曲线之间的标记点

相关内容