pgfplots で表面によって輪郭が部分的に隠れている

pgfplots で表面によって輪郭が部分的に隠れている

SEに感謝します(特に次の2つの質問に感謝します)。TikZで二変量正規分布を描くそして3D ボックスの上部にある等高線プロットを修正する方法)、1 つの詳細を除いて、pgfplots を使用して探していたものを描画できました。

この画像では:

この画像

表面に描かれた等高線が、前景では表面に隠れるが、背景では隠れないようにしたいです (実際にそのような「谷」を見ている場合のように)。これは可能ですか?

これがコードです (実行速度を上げるためにサンプリングをダウングレードしました。LaTeX-shell-escapeで実行するオプションも忘れないでください)。

\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 バッファリングが完全に実装されていないことです。

私は 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 からエクスポートし、グラフィックス オプションを使用してプロットする方がよい場合があります。

関連情報