如何在为 tikz 图形制作动画时纠正这种奇怪的曲线图案?

如何在为 tikz 图形制作动画时纠正这种奇怪的曲线图案?

首先,感谢您阅读这篇文章!

我正在尝试根据循环为 Tikz 图形制作动画。这是我使用的第一种方法的 MWE。如您所见,当第一条曲线达到我设置的极限时,它会产生奇怪的图案:

方法 1

\documentclass[border=5mm,tikz]{standalone}

\usepackage[utf8]{inputenc}
\usepackage{graphicx}
\usepackage{tikz,pgfplots}
\usepackage[dvipsnames]{xcolor}
\usetikzlibrary{patterns}
\begin{document}


\foreach \i in {0.1,0.2,...,6}{
 \begin{tikzpicture}
\begin{axis}[    
    axis line style={->},
    axis lines = middle,
    ylabel={$\lambda_t$},
    ylabel style={
            at=(current axis.above origin),
            anchor=south,
        },
    ytick={0.3,1,8},
    yticklabels={$\lambda_0'$,$\lambda_0$,A},
    yticklabel pos=left,
    xlabel={$t$},
    xlabel style={
            at=(current axis.right of origin),
            anchor=west,
        },
    xtick={4,6},
    xticklabels={$T'$,$T$},
          xmax=7,ymin=0,ymax=8,
          domain=0:\i,]
\addplot[gray]  {pow(2,(1/2)*x)} node[above]{};
\addplot[brown, restrict y to domain=0:8]  {-0.7+pow(2,(1.55/2)*x)} node[pos=0.5,left]{$\rho'>\rho$};
     \draw[black, dashed, thick] (axis cs:0,8) -- (axis cs:6,8);
     \draw[black, dashed, thick] (axis cs:4,0) -- (axis cs:4,8);
      \draw[black, dashed, thick] (axis cs:6,0) -- (axis cs:6,8);
\end{axis}
\end{tikzpicture}
}

诡异的

我找到了一种修复方法,但这不是令人满意的解决方案。如您所见,节点现在正在移开。此外,出于其他一些原因,我希望图表与方法 1 中显示的一样。

方法 2

    \foreach \i in {0.1,0.2,...,6}{
 \begin{tikzpicture}
\begin{axis}[    
    axis line style={->},
    axis lines = middle,
    ylabel={$\lambda_t$},
    ylabel style={
            at=(current axis.above origin),
            anchor=south,
        },
    ytick={0.3,1,8},
    yticklabels={$\lambda_0'$,$\lambda_0$,A},
    yticklabel pos=left,
    xlabel={$t$},
    xlabel style={
            at=(current axis.right of origin),
            anchor=west,
        },
    xtick={4,6},
    xticklabels={$T'$,$T$},
          xmax=7,ymin=0,ymax=8,
          domain=0:\i,]
\addplot[gray]  {pow(2,(1/2)*x)} node[above]{};
\addplot[brown]  {-0.7+pow(2,(1.55/2)*x)} node[pos=0.5,left]{$\rho'>\rho$};
     \draw[black, dashed, thick] (axis cs:0,8) -- (axis cs:6,8);
     \draw[black, dashed, thick] (axis cs:4,0) -- (axis cs:4,8);
      \draw[black, dashed, thick] (axis cs:6,0) -- (axis cs:6,8);
\end{axis}
\end{tikzpicture}
}

不令人满意

这两种方法唯一的区别在于,在第一种方法中,我仅尝试用 来限制曲线上的域restrict y domain 0:8。在第二种方法中,我删除了这部分并限制了ymax=8

也许解决方案是使用具有不同最大值的双循环,但就我而言,到目前为止它还没有起作用。

再次感谢您关注我的帖子。

答案1

第二种方法,ymax单独使用,只是简单地剪切图形,而前一种方法使用restrict y to domain会抑制所有相交或超出限制的曲线段。这就是抖动的原因,其程度取决于曲线的采样。例如,增加采样samples=300可以改善结果,但标签仍然会有些抖动。

可能的修复方法是ymax单独剪辑图形,并在达到限制后绘制图形的保存版本:

\documentclass[border=5mm,tikz]{standalone}

\usepackage[utf8]{inputenc}
\usepackage{tikz,pgfplots}
\usepackage{xcolor}

\ExplSyntaxOn
  \let\fpCompare\fp_compare:nNnTF
\ExplSyntaxOff

\usetikzlibrary{patterns}
\begin{document}

\foreach \i in {0.1,0.2,...,6}{
  \begin{tikzpicture}
    \begin{axis}[    
      axis line style={->},
      axis lines = middle,
      ylabel={$\lambda_t$},
      ylabel style={
        at=(current axis.above origin),
        anchor=south,
      },
      ytick={0.3,1,8},
      yticklabels={$\lambda_0'$,$\lambda_0$,A},
      yticklabel pos=left,
      xlabel={$t$},
      xlabel style={
        at=(current axis.right of origin),
        anchor=west,
      },
      xtick={4,6},
      xticklabels={$T'$,$T$},
      xmax=7,ymin=0,ymax=8,
      domain=0:\i,]
      \addplot[gray]  {pow(2,(1/2)*x)} node[above]{};
      \fpCompare{-0.7+2**(1.55/2*\i)}>{8}{
        \ifdefined\savedPath
          \draw[brown,use path=\savedPath]; \node[brown,at=(label)] {$\rho'>\rho$};
        \else  
          \addplot[brown, save path=\savedPath] {-0.7+pow(2,(1.55/2)*x)} node[pos=0.5,left] (label) {$\rho'>\rho$};
        \fi
      }{
        \addplot[brown] {-0.7+pow(2,(1.55/2)*x)} node[pos=0.5,left] {$\rho'>\rho$};
      }
      \draw[black, dashed, thick] (axis cs:0,8) -- (axis cs:6,8);
      \draw[black, dashed, thick] (axis cs:4,0) -- (axis cs:4,8);
      \draw[black, dashed, thick] (axis cs:6,0) -- (axis cs:6,8);
    \end{axis}
  \end{tikzpicture}
}
\end{document}

在此处输入图片描述

相关内容