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-버퍼링이 완전히 구현되지 않았기 때문입니다.
나는 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에서 내보내고 그래픽 옵션을 통해 플롯하는 것이 더 나을 수 있습니다.