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希望するプロットは得られません。したがって、私の知る限りでは、次の 3 つのオプションが残ります。

  1. 図を2つのステップで異なるレイヤーにプロットする
  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 ratioPhelype Oleinik の削除された回答 (ありがとうございます!) の指示を適応しました。これは、この回答の以前のバージョンでは無視していた 2 番目のリクエストに対応しています (申し訳ありません)。この場合、あなたが望んでいると思ったことを実現するのはかなり簡単です。ただし、より複雑な状況では、このトリックは失敗する可能性があります。

4 番目のオプションを選択する場合は、次の点を検討してください。

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

ここに画像の説明を入力してください

例えばここ漸近線の例をもっと見たい方は、こちらをクリックしてください。

関連情報