pgfplots 中被表面部分隐藏的轮廓

pgfplots 中被表面部分隐藏的轮廓

感谢 SE(特别是这两个问题:在 TikZ 中绘制二元正态分布如何修复 3D 框顶部的轮廓图), 除了一个细节之外,我已经能够使用 pgfplots 绘制出我想要的内容。

在此图中:

这个图片

我希望表面上绘制的轮廓线被前景中的表面隐藏,但不被背景中的表面隐藏(就像您真的在看这样的“山谷”一样)。可以这样做吗?

这是代码(我降低了采样率以使其运行得更快,并且不要忘记-shell-escape使用 LaTeX 运行它的选项)。

\documentclass{standalone}

\usepackage{pgfplots}

\usepackage{amsmath}

\begin{document}

\pgfplotsset{
colormap={whitered}{color(0cm)=(white); color(1cm)=(orange!75!red)}
}

\begin{tikzpicture}
  \begin{axis}[
    colormap name=whitered,
    3d box,
    width=15cm,
    view={25}{25},
    enlargelimits=false,
    grid=major,
    domain=-0.5:4.7,
    y domain=-2:2,
    samples=21,
    xlabel=$x$,
    ylabel=$\dot{x}$,
    zlabel={$\text{E}_{\text{m}}$},
    colorbar,
    colorbar style={
        at={(1,0)},
        anchor=south west,
        height=0.1*\pgfkeysvalueof{/pgfplots/parent axis height},
        title={$\text{E}_{\text{m}}(x,\dot{x})$}
        }
    ]
\addplot3 [surf] {-0.7+4*exp(-0.5*(x+3))*(3*cos(4*x*180/pi)+2.5*cos(2*x*180/pi)) + 0.5*y*y*4};
\addplot3 [contour gnuplot={number=14,labels={false},draw color=black},
    samples=21,
    ] {-0.7+4*exp(-0.5*(x+3))*(3*cos(4*x*180/pi)+2.5*cos(2*x*180/pi)) + 0.5*y*y*4};
\addplot3 [domain=-0.5:4.7,samples=31, samples y=0, thick, smooth]
    (x,-2,{-0.6+4*exp(-0.5*(x+3))*(3*cos(4*x*180/pi)+2.5*cos(2*x*180/pi))});
\addplot3 [contour gnuplot={number=14,labels={false},draw color=black},
    samples=21,
    z filter/.code={\def\pgfmathresult{20}},
    ] {-0.7+4*exp(-0.5*(x+3))*(3*cos(4*x*180/pi)+2.5*cos(2*x*180/pi)) + 0.5*y*y*4};

  \end{axis}
\end{tikzpicture}
\end{document}

答案1

这对于当前版本的pgfplots. 原因很简单,z-buffering 没有完全实现。

我实际上对此有点不确定,因为我没有关注 pgfplots 的那部分。

因此,您应该自己进行 z 缓冲(这可能相当麻烦)。这意味着您必须根据屏幕上的外观来绘制部件,因此需要进行大量的重复绘制。

这是一个开始:

\addplot3 [y domain=0:2,surf]
    {-0.7+4*exp(-0.5*(x+3))*(3*cos(4*x*180/pi)+2.5*cos(2*x*180/pi)) + 0.5*y*y*4};

\addplot3 [y domain=0:2,contour gnuplot={number=14,labels={false},draw color=black},samples=21, ] 
    {-0.7+4*exp(-0.5*(x+3))*(3*cos(4*x*180/pi)+2.5*cos(2*x*180/pi)) + 0.5*y*y*4};

\addplot3 [domain=-0.5:4.7,samples=31, samples y=0, thick, smooth]
    (x,-2,{-0.6+4*exp(-0.5*(x+3))*(3*cos(4*x*180/pi)+2.5*cos(2*x*180/pi))});
\addplot3 [contour gnuplot={number=14,labels={false},draw color=black},
    samples=21,z filter/.code={\def\pgfmathresult{20}}]
    {-0.7+4*exp(-0.5*(x+3))*(3*cos(4*x*180/pi)+2.5*cos(2*x*180/pi)) + 0.5*y*y*4};
\addplot3 [y domain=-2:0,surf] {-0.7+4*exp(-0.5*(x+3))*(3*cos(4*x*180/pi)+2.5*cos(2*x*180/pi)) + 0.5*y*y*4};
\addplot3 [domain=0:.25,contour gnuplot={number=14,labels={false},draw color=black},
    samples=21,
    ] {-0.7+4*exp(-0.5*(x+3))*(3*cos(4*x*180/pi)+2.5*cos(2*x*180/pi)) + 0.5*y*y*4};

生成结果:

在此处输入图片描述

如你所见,有些部分需要微调,但想法很明显。画出后退部分,然后轮廓,然后正面部分,然后通过域微调放置的所有小细节,直到获得满意的结果。

是的,对于多个较大幅度的鞍点来说,这是不可行的,在这种情况下,最好从 Octave 导出并通过图形选项进行绘制。

相关内容