Я пытался параметризоватьмой предыдущий вопрос, однако, определив новую команду, результат не такой, как я ожидал. Так что же здесь не так/чего-то не хватает?
Кроме того, поскольку мне нужно применить эту команду ко многим графикам с разными шкалами 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}