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макроса, как обсуждалось в комментариях.

Если вам нужна стрелка с текстом на дробной части высоты оси, вы можете, например, использовать подход, представленный в приведенном ниже коде, где я изменил макрос \AnnotateIntervalтак, чтобы он принимал четыре аргумента вместо трех, где третий — это дробная часть высоты стрелки.

rel axis cs:означает, что следующие координаты используют относительные координаты осей, т.е. (0,0) — это нижний левый угол оси, а (1,1) — верхний правый.

Одна вещь, о которой вы должны знать: в коде у вас есть \pgfplotsset{compat=1.14}. Если бы указанная здесь версия была 1.10или более ранней, макрос, как указано, не работал бы должным образом внутри axisсреды, поскольку координаты не соответствовали бы значениям осей. Чтобы код работал с более ранними compatнастройками, вам нужно изменить координаты с (x,y)на (axis cs:x,y). Начиная с compat=1.11, система координат по умолчанию — axis 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}

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