pgfplots의 표면에 의해 부분적으로 숨겨진 윤곽

pgfplots의 표면에 의해 부분적으로 숨겨진 윤곽

SE에게 감사드립니다(특히 다음 두 가지 질문:TikZ에서 이변량 정규분포 그리기그리고3D 상자 상단의 등고선 플롯을 수정하는 방법), 나는 한 가지 세부 사항을 제외하고 pgfplots를 사용하여 내가 찾고 있던 것을 그릴 수 있었습니다.

이 이미지에서:

이 사진

나는 표면에 그려진 등고선이 전경의 표면에 의해 숨겨지지만 배경에서는 숨겨지길 원합니다(실제로 그러한 "계곡"을 보고 있는 것처럼). 그렇게 하는 것이 가능합니까?

다음은 코드입니다(더 빠르게 실행하기 위해 샘플링을 다운그레이드했으며 -shell-escapeLaTeX로 실행하는 옵션도 잊지 않았습니다).

\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에서 내보내고 그래픽 옵션을 통해 플롯하는 것이 더 나을 수 있습니다.

관련 정보