![如何在为 tikz 图形制作动画时纠正这种奇怪的曲线图案?](https://linux22.com/image/447257/%E5%A6%82%E4%BD%95%E5%9C%A8%E4%B8%BA%20tikz%20%E5%9B%BE%E5%BD%A2%E5%88%B6%E4%BD%9C%E5%8A%A8%E7%94%BB%E6%97%B6%E7%BA%A0%E6%AD%A3%E8%BF%99%E7%A7%8D%E5%A5%87%E6%80%AA%E7%9A%84%E6%9B%B2%E7%BA%BF%E5%9B%BE%E6%A1%88%EF%BC%9F.png)
首先,感谢您阅读这篇文章!
我正在尝试根据循环为 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}