pgfplots: 새로운 TikZ 명령이 예상대로 작동하지 않습니다

pgfplots: 새로운 TikZ 명령이 예상대로 작동하지 않습니다

매개변수화를 시도했습니다.내 이전 질문, 그러나 새 명령을 정의하면 결과가 예상과 다릅니다. 그렇다면 여기서 무엇이 잘못되었거나 누락되었나요?

또한 이 명령을 다양한 y 스케일을 가진 많은 플롯에 적용해야 하는데 화살표 높이를 특정 y 값에 배치하는 대신 어떻게 전체 플롯 높이의 백분율 또는 분수로 만들 수 있습니까?

\documentclass[border=1cm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.14}
\usetikzlibrary{arrows.meta}
\tikzset{
    IntervalLine/.style={
        draw=black, 
        line width=1pt
    },
    IntervalArrow/.style={
    blue,
    very thick,
    {Stealth}-{Stealth}
    }
}


\newcommand{\AnnotateInterval}[3]{
    \begin{tikzpicture}
    \draw[IntervalLine] (#1, \pgfkeysvalueof{/pgfplots/ymin}) -- (#1, \pgfkeysvalueof{/pgfplots/ymax});
    \draw[IntervalLine] (#2, \pgfkeysvalueof{/pgfplots/ymin}) -- (#2, \pgfkeysvalueof{/pgfplots/ymax});
    \draw[IntervalArrow] (#1,2) -- node[above,align=center]{#3} (#2,2);
    \end{tikzpicture}
}


\begin{document}
    \begin{tikzpicture}
    \begin{axis}[xmin=0,xmax=5]
    \addplot[mark=none,blue] {x^2};
    \AnnotateInterval{2}{4}{some text}
    \end{axis}
    \end{tikzpicture}
\end{document}

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

답변1

코드 출력을 보다 합리적으로 만들려면 주석에서 설명한 대로 매크로 에서 \begin{tikzpicture}및를 제거하면 됩니다.\end{tikzpicture}\AnnotateInterval

축 높이의 일부에 텍스트가 있는 화살표를 원하는 경우 예를 들어 아래 코드의 접근 방식을 사용할 수 있습니다. 여기서 매크로는 \AnnotateInterval3개가 아닌 4개의 인수를 사용하도록 수정했습니다. 여기서 세 번째는 분수입니다. 화살표의 높이.

rel axis cs:는 다음 좌표가 상대 축 좌표를 사용함을 의미합니다. 즉, (0,0)은 축의 왼쪽 하단 모서리이고 (1,1)은 오른쪽 상단입니다.

당신이 알아야 할 한 가지: 코드에는 \pgfplotsset{compat=1.14}. 여기에 지정된 버전이 이전 버전이었다면 좌표가 축 값과 일치하지 않기 때문에 1.10지정된 매크로가 환경 내에서 제대로 작동하지 않았을 것입니다 . axis코드가 이전 설정과 함께 작동하도록 하려면 좌표를 에서 로 compat변경해야 합니다 . 부터는 기본 좌표계가 이므로 명시적으로 지정할 필요가 없습니다.(x,y)(axis cs:x,y)compat=1.11axis cs

\documentclass[border=1cm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.14}
\usetikzlibrary{arrows.meta}
\tikzset{
    IntervalLine/.style={
        draw=black, 
        line width=1pt
    },
    IntervalArrow/.style={
    blue,
    very thick,
    {Stealth}-{Stealth}
    }
}


\newcommand{\AnnotateInterval}[4]{
    \draw[IntervalLine] (#1, \pgfkeysvalueof{/pgfplots/ymin}) -- (#1, \pgfkeysvalueof{/pgfplots/ymax});
    \draw[IntervalLine] (#2, \pgfkeysvalueof{/pgfplots/ymin}) -- (#2, \pgfkeysvalueof{/pgfplots/ymax});
    \coordinate (tmp) at (rel axis cs:0,#3);
    \draw[IntervalArrow] (#1,2 |- tmp) -- node[above,align=center]{#4} (#2,2 |- tmp);
}


\begin{document}
    \begin{tikzpicture}
    \begin{axis}[xmin=0,xmax=5]
    \addplot[mark=none,blue] {x^2};
    \AnnotateInterval{2}{4}{0.2}{some text}
    \end{axis}
    \end{tikzpicture}
\end{document}

관련 정보