Eje y escala en trazado 3D.

Eje y escala en trazado 3D.

Amigos, lo estoy pasando mal tratando de descubrir cómo hacer que el eje aparezca "dentro" de la trama. Cuando uso la opción axis on topaparece siempre delante del gráfico y cuando no la uso se quedan detrás del gráfico. ¿Hay alguna manera de hacer que el eje sea visible solo cuando el gráfico no está frente a él? Además, ¿se puede escalar el eje z de la función trazada?

Puedes ver a continuación mi código y cifras de lo que tengo y lo que desearía tener.

\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}

Izquierda: lo que tengo, derecha: lo que me gustaría conseguir.

Izquierda: lo que tengo, derecha: lo que me gustaría conseguir

Respuesta1

El problema es que pgfplots(todavía) no viene con un verdadero motor 3D. Por lo tanto, los trucos estándar como este axis backgroundno te darán la trama deseada. Entonces, hasta donde yo sé, te quedan tres opciones:

  1. trazar la figura en dos pasos y en diferentes capas
  2. dibujar el eje a mano
  3. espera unos años
  4. usar asíntota

En caso de que optes por la primera opción, mira

\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}

ingrese la descripción de la imagen aquí

ACTUALIZAR: Adapté la axis ratiodirectiva de la respuesta eliminada de Phelype Oleinik (¡Gracias!). Esto aborda su segunda solicitud, que he estado ignorando en las versiones anteriores de esta respuesta (Lo siento). En este caso, es bastante sencillo lograr lo que pensé que querías. Sin embargo, en situaciones más complejas, este truco puede fallar.

En caso de que elijas la cuarta opción, puedes considerar:

\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}

ingrese la descripción de la imagen aquí

Ver por ejemploaquípara más ejemplos de asíntotas.

información relacionada