직사각형 패치를 사용하여 동심 타원을 동심원으로 바꾸기

직사각형 패치를 사용하여 동심 타원을 동심원으로 바꾸기

두 다이어그램을 혼합하여 그려보고 싶습니다. 원점에 대한 내 코드는 다음과 같습니다.

\documentclass{article}

\usepackage{pgfplots}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usepackage{tkz-euclide}
%\pgfplotsset{compat=newest} %<------ Here
\pgfplotsset{compat=1.11} %<------ Or use this one

\begin{document}

\begin{center}
\begin{tikzpicture}[scale=1.5][x=1cm,y=1cm]
\begin{axis}[xtick={-5,-4,-3,-2,-1,0,1,2,3,4,5}, ytick={-5,-4,-3,-2,-1,0,1,2,3,4,5},
xmin=-5, xmax=5, ymin=-5, ymax=5, grid=major,
xlabel={Galactic longitude $\ell$ in degree},
ylabel={Galactic latitude $b$ in degree},
axis lines = left,
axis line style={->}]

 % rectangle
 \draw[blue] (0,0) circle[radius=1];
 \draw[blue] (0,0) circle[radius=2];
 \draw[blue] (0,0) circle[radius=3];
 \draw[blue] (0,0) circle[radius=4];
 \draw[blue] (0,0) circle[radius=5];
\end{axis}
\end{tikzpicture}
\end{center}
\end{document}

동심원을 그리려고 했는데 결국 타원이 생겼습니다. 이 문제를 어떻게 해결할 수 있는지 알고 싶습니다.

두 번째 문제는 다음과 같습니다. 이미지 뒤에 직사각형 패치를 추가하고 싶습니다.

직사각형 패치.

나는 이 두 가지 문제로 어려움을 겪고 있습니다. 타원을 원으로 바꾸고 그 위에 직사각형 패치를 배치하는 것입니다.

답변1

다음을 사용할 수 있습니다.

\documentclass[tikz, border=2mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}

\begin{document}

\begin{tikzpicture}[scale=1.5]
  \begin{axis}[
    xmin=-5, xmax=5, ymin=-5, ymax=5, grid=major,
    xtick={-5,...,5}, ytick={-5,...,5},
    unit vector ratio = 1 1,
    xlabel={Galactic longitude $\ell$ in degree},
    ylabel={Galactic latitude $b$ in degree},
    axis lines = left,
    axis line style={->},
    clip=false]

   \pgfplotsinvokeforeach {1,...,5} {
     \draw[blue] (0,0) circle[radius=#1];
   }
   \draw[green, thick, fill=white] (-5,-0.5) rectangle (5,0.5);
  \end{axis}
\end{tikzpicture}

\end{document}

스크린샷

노트:

  • tikzpicture( \begin{tikzpicture}[scale=1.5][x=1cm,y=1cm]는 올바르지 않습니다. 다음과 같은 것을 사용하는 것이 좋습니다 \begin{tikzpicture}[scale=1.5, x=1cm,y=1cm]) 에 여러 선택적 인수를 전달하지 마십시오 .

  • pgfplots호환성 수준 1.11은 약간 오래되었으므로 1.16으로 올렸습니다. \pgfplotsset{compat=newest}플롯 작업을 적극적으로 수행하고 모든 문제를 해결하려고 할 때는 괜찮을 수 있지만그 다음에나중에 다시 컴파일할 때 플롯이 자동으로 다른 결과를 생성하지 않도록 버전을 하드코딩하는 것이 좋습니다.
    본질적으로 말하는 것은 \pgfplotsset{compat=1.16}다음과 같습니다. “이 플롯이 호환성 수준 1.16에서 제대로 작동하는지 확인했습니다 pgfplots. 다시 컴파일할 때마다 동일한 동작을 원합니다. 변경 사항으로 인해 발생할 수 있는 잠재적인 문제를 해결할 준비가 된 경우에만 pgfplots최신 호환성 수준으로 전환합니다(최신 버전이 pgfplots출시되면 현재 시점에서는 1.16이 최신 버전임).”

  • 저는 \pgfplotsinvokeforeach루프를 사용하여 원을 그렸습니다.

  • axis cs나는 암시적 좌표계(호환성 수준 1.11부터 암시적)를 사용하여 직사각형을 그렸습니다 .

  • 채우기가 원과 격자를 덮는지 확인하기 위해 원 뒤에 그렸습니다.

  • 각 축의 단위가 동일한 길이로 표시되도록 옵션을 사용했습니다 unit vector ratio = 1 1(이것이 타원이 아닌 원을 실제 원으로 만드는 것입니다).

  • clip=false녹색 직사각형의 왼쪽과 오른쪽이 잘리지 않았는지 확인합니다(그렇지 않으면 선 너비의 절반이 잘립니다. 시도해 보십시오).

직사각형 패치를 그리는 데 또 다른 좌표계를 사용할 수 있습니다 rel axis cs.좌표계 상대 축 cs에서pgfplots 매뉴얼). 이 경우 좌표는 데이터 값과 일치하지 않습니다. 대신, [0,1] 범위는 각 플롯 축이 포함하는 범위에 매핑됩니다(엑스그리고와이여기서는 3D 플롯에서도 작동합니다. 즉, 녹색 직사각형을 다음과 같이 그릴 수도 있습니다.

\draw[green, thick, fill=white]
  (rel axis cs:0,0.45) rectangle (rel axis cs:1,0.55);

관련 정보