Intenté parametrizarmi pregunta anterior, sin embargo, al definir un nuevo comando, el resultado no es el que esperaba. Entonces, ¿qué está mal/falta aquí?
Además, dado que necesito aplicar este comando a muchos gráficos con diferentes escalas y, ¿cómo puedo hacer que la altura de la flecha sea un porcentaje o una fracción de la altura total del gráfico en lugar de posicionarla en un cierto valor de 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}
Respuesta1
Para que la salida de su código sea más sensata, simplemente elimine \begin{tikzpicture}
y \end{tikzpicture}
de la \AnnotateInterval
macro, como se indicó en los comentarios.
Si desea la flecha con texto a una fracción de la altura del eje, puede, por ejemplo, usar el enfoque en el siguiente código, donde modifiqué la \AnnotateInterval
macro para tomar cuatro argumentos, en lugar de tres, donde el tercero es el fraccionario. altura de la flecha.
rel axis cs:
significa que las siguientes coordenadas usan coordenadas de eje relativas, es decir, (0,0) es la esquina inferior izquierda del eje y (1,1) es la esquina superior derecha.
Una cosa que debes tener en cuenta: en el código que tienes \pgfplotsset{compat=1.14}
. Si la versión especificada aquí hubiera sido 1.10
o anterior, la macro especificada no habría funcionado correctamente dentro del axis
entorno, porque las coordenadas no habrían correspondido a los valores de los ejes. Para que el código funcione con compat
configuraciones anteriores, debe cambiar las coordenadas de (x,y)
a (axis cs:x,y)
. A partir de compat=1.11
, el sistema de coordenadas predeterminado es axis cs
, por lo que no es necesario especificarlo explícitamente.
\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}