pgfplot이 3D 표면 플롯을 더 보기 좋게 변경하는 방법

pgfplot이 3D 표면 플롯을 더 보기 좋게 변경하는 방법

TikZ/pgf를 사용하여 다음으로 구성된 3D 그래픽을 생성하고 싶습니다.

  • (x, y) != (0,0) 및 f(0,0)=0일 때 함수 f(x, y) = xy/(x^2 + y^2)의 플롯;
  • 평면 y = x와 표면의 교차점, 즉 방정식 y = x, z = 1/2이지만 점 (0, 0, 1/2)이 생략된 선입니다.
  • 원산지; 그리고
  • 적어도 x, y, z 축의 양수 부분.

Mathematica 플롯

해당 그래픽은 Mathematica로 생성되었으며 (r,θ, ψ) 구형 좌표(각도가 아닌 라디안임)의 시점(2.85216, 1.62152, 0.828166)을 사용합니다.

pgfplots시도는 아래 코드를 사용하고 그 뒤에 표시된 그래픽을 생성합니다.

질문pgfplots: 다음과 같이 Mathematica 그래픽과 매우 유사하도록 코드를 어떻게 변경할 수 있습니까 ?

  1. 본질적으로 동일한 시점(따라서 동일한 축 방향)을 사용합니다.

  2. 표면의 윤곽선 규칙을 생략합니다.

  3. y = x, z = 1/2 선의 z축에 끊김이 있습니다.

  4. 원점에서 더 확실한 점을 사용합니다. 그리고

  5. Z축 근처 표면의 "재기스"를 방지합니다.

Re 5. 값을 높이려고 했지만 samples그렇게 하면 TeX capacity exceeded오류가 발생합니다!

pgfplot결과:

pgfplot

내 코드:

\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}

% Define a grayscale colormap
\pgfplotsset{
    colormap={grayscale}{[1pt] rgb255(0pt)=(0,0,0); rgb255(1000pt)=(255,255,255)}
}

\begin{document}
\begin{tikzpicture}
\begin{axis}[
    view={75.833}{35.3489},
    axis lines=center, 
    xlabel={$x$}, ylabel={$y$}, zlabel={$z$},
    ticks=none, 
    domain=-1:1, y domain=-1:1,
    samples=50, % need to avoid "jaggies"
    z buffer=sort,
    clip=false,
    xmin=-1, xmax=1, ymin=-1, ymax=1, zmin=-1, zmax=1.5, 
    colormap name=grayscale, 
    xlabel style={anchor=north west}, ylabel style={anchor=north west},
    zlabel style={anchor=south},
    ]
    % Surface plot
    \addplot3[surf, shader=faceted interp, opacity=0.7] 
        {x != 0 || y != 0 ? (x*y)/(x^2 + y^2) : 0};
    % Point at the origin
    \addplot3[mark=*, mark size=1,mark options={color=black}] coordinates {(0, 0, 0)};
    % Curve of intersection of plane and surface
    \addplot3[samples=20, samples y=0, thick, color=black] 
        ({x}, {x}, {1/2});
\end{axis}
\end{tikzpicture}
\end{document}

답변1

업데이트

여기에 이미지 설명을 입력하세요

업데이트

@murray의 수많은 의견에 따라 코드를 수정했습니다. 표면을 표현하는 방법에는 정의 영역에 극좌표를 사용하거나 일반 좌표를 사용하는 두 가지 방법이 있습니다. 전자는 원점의 특이점을 존중하기 때문에 이상적으로 처리합니다. 후자는 함수의 초기 정의를 고수하지만 (0, 0) 주변의 동작에 어려움을 겪습니다.

후자의 경우 초기 답변과 관련된 주요 수정 사항은 다음과 같습니다.

  • 표면이 두 개로 분할됩니다(와이<0그리고와이>0각기)
  • 표면을 더 잘 이해할 수 있도록 테두리가 추가되었습니다.
  • 축은 별도로 그려집니다(TikZ 세그먼트로).

다양한 그래픽 요소의 순서가 중요합니다.

주목matplotlib아래에는 10000x10000 그리드를 기반으로 한 계산을 사용하여 얻은 이미지가 있습니다 . 후자의 관점에서는 표면이 원점 주변을 매끄럽게 할 수 없습니다.

여기에 이미지 설명을 입력하세요

도메인의 극좌표를 사용하는 도면의 새 코드

\documentclass[11pt, margin=10pt]{standalone}
\usepackage{pgfplots}
\usetikzlibrary{math}
  
\pgfplotsset{compat=1.17}
\begin{document}

 \pgfplotsset{
    colormap={cmpgray}{rgb255=(221,221,221) rgb255=(54,54,54)}
} 
\xdefinecolor{axisRGB}{RGB}{128, 30, 0}  % {128, 128, 145}
\begin{tikzpicture}
  \begin{axis}[
    data cs=polar,
    axis lines=none,  % grid=major,
    view={110}{22},
    z buffer=sort,
    clip=false]
    
    % negative Ox axis 
    \draw[axisRGB, thin] (0, 0, 0) -- (-1.8, 0, 0);
    \draw[axisRGB, thin, ->] (0, 0, .02) -- (0, 0, .8)
    node[right, text=black, scale=.7] {$z$};

    \addplot3[
    surf,
    shader=interp,
    domain=0:360, domain y=.02:1.4,
    samples=50, samples y=20,
    opacity=0.95]
    {.5*sin(2*x)};
    
    % negative Oy axis 
    \draw[axisRGB, thin] (0, 0, 0) -- (0, -1.8, 0);
    % negative Oz axis 
    \draw[axisRGB, thin] (0, 0, -.025) -- (0, 0, -.8);
    
    % point at the origin
    \fill[opacity=.7] (0, 0, 0) circle (1.2pt);

    \draw[axisRGB, thin, ->] (0, .02, 0, 0) -- (0, 1.8, 0)
    node[below, text=black, scale=.7] {$y$};
    \draw[axisRGB, thin, ->] (.02, 0, 0) -- (1.8, 0, 0)
    node[below, text=black, scale=.7] {$x$};

    % Intersection curve of surface and plane z=1/2
    \draw[thin] (-1, -1, 1/2) -- (1, 1, 1/2);
  \end{axis}
\end{tikzpicture}
\end{document}

두 번째 그림의 새 코드

\documentclass[11pt, margin=10pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.17}
\begin{document}
 \pgfplotsset{
    colormap={cmpgray}{rgb255=(221,221,221) rgb255=(54,54,54)}
} 
\xdefinecolor{axisRGB}{RGB}{128, 128, 145}

\begin{tikzpicture}
  \begin{axis}[
    view={115}{19},
    axis lines=none,  % center, 
    xlabel={$x$}, ylabel={$y$}, zlabel={$z$},
    ticks=none, 
    z buffer=sort,
    clip=false,
    xmin=-1.3, xmax=1.3,
    ymin=-1.3, ymax=1.3,
    zmin=-1, zmax=1.3, 
    xlabel style={anchor=north west, scale=.8},
    ylabel style={anchor=north west, scale=.8},
    zlabel style={anchor=south, scale=.8},
    ]
    
    % Surface y<0
    \addplot3[
    surf,
    domain=-1:1,
    y domain=-1:-.005,
    samples=55, 
    colormap name=cmpgray,
    shader=interp,  % flat, faceted interp,
    opacity=0.75]
    {x*y/(x^2 + y^2)};

    % Surface y<0 's border
    \addplot3[%
    draw=black, ultra thin,
    domain=-1:1,
    samples y=0]
    (x, -1, {-x/(x*x +1)});
    \addplot3[%
    draw=black, ultra thin,
    domain=-1:1,
    samples y=0]
    (-1, x, {-x/(x*x +1)});

    % negative Ox and Oy axes
    \draw[axisRGB, thin] (0, 0, 0) -- (0, -1.4, 0);
    \draw[axisRGB, thin] (0, 0, 0) -- (-1.4, 0, 0);

    % Point at the origin
    \fill (0, 0, 0) circle (1.2pt);

    % positive Oz axis 
    \draw[axisRGB, thin, ->] (0, 0, .02) -- (0, 0, 1.3)
    node[right, text=black, scale=.7] {$z$};
    
    % Surface y>0
    \addplot3[
    surf,
    domain=-1:1,
    y domain=.005:1,
    samples=55, 
    colormap name=cmpgray, 
    shader=interp,  % flat, faceted interp,
    opacity=0.75]
    {x*y/(x*x + y*y)};

    % positive Oy axis 
    \draw[axisRGB, thin, ->] (0, .02, 0, 0) -- (0, 1.4, 0)
    node[below, text=black, scale=.7] {$y$};

    % negative Oz axis 
    \draw[axisRGB, thin] (0, 0, -.025) -- (0, 0, -1.3);

    % Intersection curve of surface and plane z=1/2
    \draw[thin] (-1, -1, 1/2) -- (1, 1, 1/2);

    % Surface y>0 's border
    \addplot3[%
    draw=black, very thin,
    domain=-1:1,
    samples y=0]
    (x, 1, {x/(x*x +1)});
    \addplot3[%
    draw=black, very thin,
    domain=-1:1,
    samples y=0]
    (1, x, {x/(x*x +1)});

    % positive Ox axis 
    \draw[axisRGB, thin, ->] (.02, 0, 0) -- (1.5, 0, 0)
    node[below, text=black, scale=.7] {$x$};
  \end{axis}
\end{tikzpicture}
\end{document}

이전 답변

여기에 이미지 설명을 입력하세요

이 같은; 시점, 좌표축 길이, 셰이더만 변경했습니다.

코드

\documentclass[11pt, margin=10pt]{standalone}
\usepackage{pgfplots}
\usepgfplotslibrary{colorbrewer}

\pgfplotsset{compat=1.17}
\begin{document}

\begin{tikzpicture}
  \begin{axis}[
    view={115}{15},
    axis lines=center, 
    xlabel={$x$}, ylabel={$y$}, zlabel={$z$},
    ticks=none, 
    domain=-1:1, y domain=-1:1,
    samples=50, % need to avoid "jaggies"
    z buffer=sort,
    clip=false,
    xmin=-1.3, xmax=1.3,
    ymin=-1.3, ymax=1.3,
    zmin=-1, zmax=1.3, 
    xlabel style={anchor=north west, scale=.8},
    ylabel style={anchor=north west, scale=.8},
    zlabel style={anchor=south, scale=.8},
    ]
    % Surface plot
    \addplot3[
    surf,
    colormap/Blues,  % cool,
    % shader=faceted interp,
    opacity=0.3] 
    {x != 0 || y != 0 ? (x*y)/(x^2 + y^2) : 0};
    
    % Point at the origin
    \addplot3[mark=*, mark size=1,mark options={color=black}]
    coordinates {(0, 0, 0)};
    
    % Curve of intersection of plane and surface
    \addplot3[samples=20, samples y=0, thick, color=black] 
    ({x}, {x}, {1/2});
  \end{axis}
\end{tikzpicture}
\end{document}

관련 정보