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}

相关内容