pgfplots: O novo comando TikZ não funciona como esperado

pgfplots: O novo comando TikZ não funciona como esperado

tentei parametrizarminha pergunta anterior, ao definir um novo comando, porém, o resultado não é o que eu esperava. Então, o que está errado/faltando aqui?

Além disso, como preciso aplicar este comando a muitos gráficos com escalas y diferentes, como posso tornar a altura da seta uma porcentagem ou fração de toda a altura do gráfico, em vez de posicioná-la em um determinado valor 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}

insira a descrição da imagem aqui

Responder1

Para tornar a saída do seu código mais sensata, basta remover \begin{tikzpicture}e \end{tikzpicture}da \AnnotateIntervalmacro, conforme discutido nos comentários.

Se você quiser a seta com texto em uma fração da altura do eixo, você pode, por exemplo, usar a abordagem no código abaixo, onde modifiquei a \AnnotateIntervalmacro para receber quatro argumentos, em vez de três, onde o terceiro é o fracionário altura da flecha.

rel axis cs:significa que as seguintes coordenadas usam coordenadas relativas do eixo, ou seja, (0,0) é o canto inferior esquerdo do eixo e (1,1) é o canto superior direito.

Uma coisa que você deve estar ciente: no código você tem \pgfplotsset{compat=1.14}. Se a versão especificada aqui fosse 1.10ou anterior, a macro especificada não teria funcionado corretamente dentro do axisambiente, pois as coordenadas não corresponderiam aos valores dos eixos. Para fazer o código funcionar com compatconfigurações anteriores, você precisa alterar as coordenadas de (x,y)para (axis cs:x,y). Começando com compat=1.11, o sistema de coordenadas padrão é axis cs, portanto, não é necessário especificá-lo explicitamente.

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

informação relacionada