Vielen Dank an SE (und insbesondere an diese beiden Fragen:Zeichnen Sie eine bivariate Normalverteilung in TikZUndSo befestigen Sie ein Konturdiagramm oben auf einer 3D-Box), konnte ich mit pgfplots bis auf ein Detail das zeichnen, was ich suchte.
In diesem Bild:
Ich möchte, dass die auf der Oberfläche gezeichneten Konturlinien im Vordergrund von der Oberfläche verdeckt werden, im Hintergrund jedoch nicht (wie es der Fall wäre, wenn man tatsächlich auf ein solches „Tal“ blicken würde). Ist das möglich?
Hier ist der Code (ich habe die Abtastung heruntergestuft, damit es schneller läuft, und vergessen Sie nicht die -shell-escape
Option, es mit LaTeX laufen zu lassen).
\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}
Antwort1
Dies ist sehr schwierig mit der aktuellen Version vonpgfplots
Der einfache Grund ist, dass Z-Buffering nicht vollständig implementiert ist.
Ich bin mir da tatsächlich etwas unsicher, da ich diesen Teil von pgfplots nicht verstanden habe.
Daher sollten Sie Ihr eigenes Z-Buffering durchführen (was ziemlich umständlich sein kann). Dies bedeutet, dass Sie die Teile entsprechend ihrem Erscheinungsbild auf dem Bildschirm zeichnen müssen, was viele Doppelzeichnungen zur Folge hat.
Hier ist ein Anfang:
\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};
was ergibt:
Wie Sie sehen, müssen einige Teile noch verfeinert werden, aber die Idee ist offensichtlich. Zeichnen Sie diezurückTeil, dann die Konturen, dann dieVorderseiteTeil und optimieren Sie dann alle kleinen Details der Platzierung über die Domänen, bis zufriedenstellende Ergebnisse erzielt werden.
Ja, dies ist bei mehreren Sattelpunkten mit großer Größenordnung nicht durchführbar. In diesem Fall ist es möglicherweise besser, aus Octave zu exportieren und über die Grafikoption zu plotten.