Achsen und Skalierung im 3D-Diagramm

Achsen und Skalierung im 3D-Diagramm

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 toperscheint 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.

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 backgroundnicht die gewünschte Handlung liefern. Nach meinem derzeitigen Kenntnisstand bleiben Ihnen also drei Möglichkeiten:

  1. Zeichnen Sie die Figur in zwei Schritten und auf unterschiedlichen Ebenen
  2. Zeichnen Sie die Achse von Hand
  3. warte noch ein paar Jahre
  4. 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}

Bildbeschreibung hier eingeben

AKTUALISIEREN: Ich habe die axis ratioAnweisung 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}

Bildbeschreibung hier eingeben

Siehe zBHierfür weitere Asymptotenbeispiele.

verwandte Informationen