在 3D pgfplots 中拆分 y 域

在 3D pgfplots 中拆分 y 域

我想要绘制从 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}

结果!

在此处输入图片描述

相关内容