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

軸の高さの一部にテキスト付きの矢印が必要な場合は、たとえば以下のコードのアプローチを使用できます。ここでは、マクロを変更して、\AnnotateInterval3 つの引数ではなく 4 つの引数を受け取り、3 番目が矢印の高さの一部になるようにしています。

rel axis cs:は、次の座標が相対軸座標を使用することを意味します。つまり、(0,0) は軸の左下隅、(1,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}

関連情報