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 top
aparece 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.
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 background
no te darán la trama deseada. Entonces, hasta donde yo sé, te quedan tres opciones:
- trazar la figura en dos pasos y en diferentes capas
- dibujar el eje a mano
- espera unos años
- 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}
ACTUALIZAR: Adapté la axis ratio
directiva 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}
Ver por ejemploaquípara más ejemplos de asíntotas.