Ich habe versucht zu parametrisierenmeine vorherige Frage, durch die Definition eines neuen Befehls ist das Ergebnis jedoch nicht wie erwartet. Was ist also hier falsch/fehlt?
Da ich diesen Befehl außerdem auf viele Diagramme mit unterschiedlichen Y-Skalen anwenden muss, wie kann ich die Pfeilhöhe auf einen Prozentsatz oder Bruchteil der gesamten Diagrammhöhe setzen, anstatt sie auf einem bestimmten Y-Wert zu positionieren?
\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}
Antwort1
Um die Ausgabe Ihres Codes sinnvoller zu gestalten, entfernen Sie einfach \begin{tikzpicture}
und \end{tikzpicture}
aus dem \AnnotateInterval
Makro, wie in den Kommentaren erläutert.
Wenn Sie den Pfeil mit Text auf einem Bruchteil der Achsenhöhe haben möchten, können Sie beispielsweise den Ansatz im folgenden Code verwenden, bei dem ich das \AnnotateInterval
Makro so geändert habe, dass es vier statt drei Argumente annimmt, wobei das dritte der Bruchteil der Höhe des Pfeils ist.
rel axis cs:
bedeutet, dass die folgenden Koordinaten relative Achsenkoordinaten verwenden, d. h. (0,0) ist die untere linke Ecke der Achse und (1,1) die obere rechte.
Eines sollten Sie beachten: In dem Code haben Sie . Wäre die hier angegebene Version oder früher \pgfplotsset{compat=1.14}
gewesen , hätte das angegebene Makro in der Umgebung nicht richtig funktioniert, da die Koordinaten nicht den Achsenwerten entsprochen hätten. Damit der Code mit früheren Einstellungen funktioniert , müssen Sie die Koordinaten von in ändern . Ab ist das Standardkoordinatensystem , sodass eine explizite Angabe nicht erforderlich ist.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}