Freunde, ich habe große Mühe, herauszufinden, wie ich die Achse „innerhalb“ des Diagramms erscheinen lassen kann. Wenn ich die Option verwende, axis on top
erscheint sie immer vor dem Diagramm, und wenn ich sie nicht verwende, bleibt sie hinter dem Diagramm. Gibt es eine Möglichkeit, die Achse nur dann sichtbar zu machen, wenn das Diagramm nicht davor ist? Kann man außerdem die Z-Achse der dargestellten Funktion skalieren?
Unten sehen Sie meinen Code und die Zahlen von dem, was ich habe und was ich gerne hätte.
\documentclass[12pt,a4paper,final]{report}
\usepackage{tikz}
\usepackage{pgfplots}
\begin{document}
\begin{center}
\begin{tikzpicture}[]
\begin{axis}[axis lines=center,
axis on top,
xtick=\empty,
ytick=\empty,
ztick=\empty,
xrange=-2:2,
yrange=-2:2
]
% plot
\addplot3[domain=-1:1,y domain=-1:1,colormap/viridis,surf]
{sqrt(x^2+y^2)};
\addplot3[domain=-1:1,y domain=-1:1,colormap/viridis,mesh]
{-sqrt(x^2+y^2)};
\end{axis}
\end{tikzpicture}
\end{center}
\end{document}
Links: was ich habe, rechts: was ich gerne hätte.
Antwort1
Das Problem ist, dass pgfplots
(noch) keine echte 3D-Engine vorhanden ist. Daher werden Ihnen die Standardtricks wie axis background
nicht die gewünschte Handlung liefern. Nach meinem derzeitigen Kenntnisstand bleiben Ihnen also drei Möglichkeiten:
- Zeichnen Sie die Figur in zwei Schritten und auf unterschiedlichen Ebenen
- Zeichnen Sie die Achse von Hand
- warte noch ein paar Jahre
- Asymptote verwenden
Wenn Sie sich für die erste Option entscheiden, schauen Sie sich
\documentclass[12pt,a4paper,final]{report}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=1.15} %<-added
\begin{document}
\begin{center}
\begin{tikzpicture}
\begin{axis}[axis lines=center,
axis on top,
set layers=default,
xtick=\empty,
ytick=\empty,
ztick=\empty,
xrange=-2:2,
yrange=-2:2,
unit vector ratio=1 1 1,% <- HERE (taken from Phelype Oleinik's deleted answer)
scale=3 %<- added to compensate for the downscaling
% resulting from unit vector ratio=1 1 1
]
% plot
\addplot3[domain=-1:1,y domain=0:1,colormap/viridis,surf]
{sqrt(x^2+y^2)};
\addplot3[domain=-1:1,y domain=-1:0,colormap/viridis,surf,
on layer=axis foreground]
{sqrt(x^2+y^2)};
\addplot3[domain=0:1,y domain=-1:1,colormap/viridis,surf,
on layer=axis foreground]
{sqrt(x^2+y^2)};
\addplot3[domain=-1:1,y domain=-1:1,colormap/viridis,mesh]
{-sqrt(x^2+y^2)};
\end{axis}
\end{tikzpicture}
\end{center}
\end{document}
AKTUALISIEREN: Ich habe die axis ratio
Anweisung aus Phelype Oleiniks gelöschter Antwort übernommen (Danke!). Dies geht auf Ihre zweite Anfrage ein, die ich in den vorherigen Versionen dieser Antwort ignoriert habe (Entschuldigung). In diesem Fall ist es ziemlich einfach, das zu erreichen, was Sie meiner Meinung nach wollen. In komplexeren Situationen kann dieser Trick jedoch fehlschlagen.
Wenn Sie sich für die vierte Option entscheiden, können Sie Folgendes in Betracht ziehen:
\documentclass{standalone}
\usepackage{asymptote}
\begin{document}
\begin{asy}
import graph3;
size(400);
currentprojection=orthographic(4,1,1);
size3(12cm,12cm,8cm,IgnoreAspect);
real f(pair z) {
real r=abs(z);
return r;
}
real g(pair z) {
real r=abs(z);
return -r;
}
limits((-2,-2,-1.2),(2,2,1.2));
currentprojection=orthographic(1,-2,0.5);
draw(surface(f,(-2,-2),(2,2),nx=100, Spline), rgb(.6,1,0.6));
draw(surface(g,(-2,-2),(2,2),nx=100, Spline), lightgray+opacity(.7));
draw(Label("$x$",1),(-2,0,0)--(2,0,0),darkgreen,Arrow3);
draw(Label("$y$",1),(0,-2,0)--(0,2,0),darkgreen,Arrow3);
draw(Label("$f$",1),(0,0,-2)--(0,0,2),darkgreen,Arrow3);
\end{asy}
\end{document}
Siehe zBHierfür weitere Asymptotenbeispiele.