我想要绘制从 y=0-->y=3 到 y=3,2-->y=6 的函数。我想省略 3 和 3,2 之间的空格。这是我的代码:
\documentclass[border= 5mm]{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis} [ restrict z to domain=0:85,zmax=85,zmin=0, width=30 cm, height=20 cm]
\addplot3 [surf, samples=50,domain=-155:205,y domain=0:6, z buffer=sort]({sin(x)*y},{cos(x)*y},{17.22 + 5.53*y + 1.161*tan((180/pi)*(29.97 + y))});
\end{axis}
\end{tikzpicture}
\end{document}
我尝试使用 \addplot 两次,但第二个图出现在第一个图的顶部(而不是像它应该的那样出现在里面或周围)...有什么想法可以让我如何分割 y 域?
答案1
您可以使用坐标过滤器。
以下代码利用了 pgfplots 的一些实用函数来简化程序比较:
\documentclass[border= 5mm]{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis} [ restrict z to domain=0:85,zmax=85,zmin=0,
filter discard warning=false,
y filter/.code={%
\let\input=\pgfmathresult
\pgfmathparse{v}%
\let\checkValue=\pgfmathresult
\pgfmathfloatparsenumber{3}%
\let\lower=\pgfmathresult
\pgfmathfloatparsenumber{3.2}%
\let\upper=\pgfmathresult
\pgfplotscoordmath{float}{if less than}{\checkValue}{\lower}{%
\let\pgfmathresult=\input
}{%
\pgfplotscoordmath{float}{if less than}{\checkValue}{\upper}{%
\let\pgfmathresult=\empty
}{%
\let\pgfmathresult=\input
}%
}%
},
width=30 cm, height=20 cm]
\addplot3 [surf, samples=50,domain=-155:205,
variable y=\v,
y domain=0:6, z buffer=sort]
({sin(x)*v},{cos(x)*v},{17.22 + 5.53*v + 1.161*tan((180/pi)*(29.97 + v))});
\end{axis}
\end{tikzpicture}
\end{document}
\input
这个想法是,如果过滤器是“无操作”则返回,\empty
如果过滤器决定应该删除内容则返回。为了评估参数,我引入了一个新名称,variable y=\v
这样它就不会被最终的 y 坐标覆盖。
这是没有使用过滤器的结果:
答案2
经过一番考虑,由于我添加的每个 \addplot3 都一直出现在前一个的顶部,我决定从后到前“构建”图形......首先我创建了这个:
\documentclass[border= 5mm]{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis} [ restrict z to domain=0:85,zmax=85,zmin=0, width=30 cm, height=20 cm, ymin=-6 ]
\addplot3 [surf, samples=30,domain=-100:80,y domain=3.2:6, z buffer=sort]({sin(x)*y},{cos(x)*y},{17.22 + 5.53*y + 1.161*tan((180/pi)*(29.97 + y))});
\end{axis}
\end{tikzpicture}
\end{document}
当 x 从 3.2 到 6 时,结果为半回转,如图所示
在我添加了 x 值从 0 到 3 的内部完整转弯后,通过添加以下内容:
\addplot3 [surf, samples=30,domain=-100:260,y domain=0:3, z buffer=sort]({sin(x)*y},{cos(x)*y},{17.22 + 5.53*y + 1.161*tan((180/pi)*(29.97 + y))});
完整代码如下:
\documentclass[border= 5mm]{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis} [ restrict z to domain=0:85,zmax=85,zmin=0, width=30 cm, height=20 cm, ymin=-6 ]
\addplot3 [surf, samples=30,domain=-100:80,y domain=3.2:6, z buffer=sort]({sin(x)*y},{cos(x)*y},{17.22 + 5.53*y + 1.161*tan((180/pi)*(29.97 + y))});
\addplot3 [surf, samples=30,domain=-100:260,y domain=0:3, z buffer=sort]({sin(x)*y},{cos(x)*y},{17.22 + 5.53*y + 1.161*tan((180/pi)*(29.97 + y))});
\end{axis}
\end{tikzpicture}
\end{document}
结果是:
正如您所见,3 和 3.2 之间的图表是空白的!而在第一个呈现的解决方案中,这个空白被画出来了!
最后,我添加了前半圈,x 从 3.2 变为 6,方法是添加这一行
\addplot3 [surf, samples=30,domain=80:260,y domain=3.2:6, z buffer=sort]({sin(x)*y},{cos(x)*y},{17.22 + 5.53*y + 1.161*tan((180/pi)*(29.97 + y))});
完整代码如下:
\documentclass[border= 5mm]{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis} [ restrict z to domain=0:85,zmax=85,zmin=0, width=30 cm, height=20 cm, ymin=-6 ]
\addplot3 [surf, samples=30,domain=-100:80,y domain=3.2:6, z buffer=sort]({sin(x)*y},{cos(x)*y},{17.22 + 5.53*y + 1.161*tan((180/pi)*(29.97 + y))});
\addplot3 [surf, samples=30,domain=-100:260,y domain=0:3, z buffer=sort]({sin(x)*y},{cos(x)*y},{17.22 + 5.53*y + 1.161*tan((180/pi)*(29.97 + y))});
\addplot3 [surf, samples=30,domain=80:260,y domain=3.2:6, z buffer=sort]({sin(x)*y},{cos(x)*y},{17.22 + 5.53*y + 1.161*tan((180/pi)*(29.97 + y))});
\end{axis}
\end{tikzpicture}
\end{document}
结果!