Оси и масштабирование в 3D графике

Оси и масштабирование в 3D графике

Друзья, у меня возникли проблемы с тем, чтобы понять, как сделать так, чтобы ось отображалась "внутри" графика. Когда я использую эту опцию, axis on topона всегда отображается перед графиком, а когда я ее не использую, они остаются за графиком. Есть ли способ сделать ось видимой только тогда, когда график не находится перед ней? Кроме того, можно ли масштабировать ось z построенной функции?

Ниже вы можете увидеть мой код и цифры того, что у меня есть и что я хотел бы иметь.

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

Слева: то, что у меня есть, справа: то, что я хотел бы получить.

Слева: то, что у меня есть, справа: то, что я хотел бы получить

решение1

Проблема в том, что pgfplots(пока) он не поставляется с настоящим 3D-движком. Поэтому стандартные трюки типа axis backgroundне дадут вам желаемого сюжета. Так что, насколько мне известно, у вас остается три варианта:

  1. постройте рисунок в два этапа и на разных слоях
  2. нарисуйте ось вручную
  3. подожди несколько лет
  4. использовать асимптоту

Если вы выберете первый вариант, посмотрите

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

введите описание изображения здесь

ОБНОВЛЯТЬ: Я адаптировал axis ratioдирективу из удаленного ответа Фелипе Олейника (Спасибо!). Это отвечает на ваш второй запрос, который я игнорировал в предыдущих версиях этого ответа (Извините). В этом случае довольно просто добиться того, чего, как я думал, вы хотите. Однако в более сложных ситуациях этот трюк может не сработать.

Если вы выберете четвертый вариант, вы можете рассмотреть:

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

введите описание изображения здесь

См. напримерздесьдля большего количества примеров асимптот.

Связанный контент