
Ich verwende pgfplot (zum ersten Mal) und versuche, eine Art Diagramm mit horizontalen Balken zu erstellen. Siehe Abbildung.
Ich weiß, wie es geht, aber da der Code ziemlich ausführlich ist und ich viele Daten habe, habe ich die sich wiederholenden Teile in einem Makro namens herausgerechnet \labeledRange{beginpos}{endpos}{label}
. Ich habe auch einen Zähler ( vertposition
) verwendet, um die manuelle Angabe der vertikalen Position zu vermeiden (da ich möchte, dass sie für jeden Bereich hochzählt). Der Zähler verhält sich jedoch nicht wie erwartet, wenn er in einem \node
Befehl im folgenden Code verwendet wird. In der obigen Abbildung sollten die Beschriftungen LABEL1
und LABEL 2
in der Nähe des blauen bzw. roten Balkens stehen.
Wie kann ich das zum Laufen bringen?
(Und, als kleines anderes Problem, wie kann ich die ‚Pin‘-Zeile loswerden?)
\documentclass{article}
\usepackage{pgfplots}
\begin{document}
%\labeledRange{start}{end}{label}
\newcounter{vertposition}
\newcommand{\labeledRange}[3]{
\addplot coordinates {(#1,\arabic{vertposition}) (#2,\arabic{vertposition})};
\node[coordinate, pin=right:{#3}]
at (axis cs:#2,\arabic{vertposition}) {};
\stepcounter{vertposition}
}
\begin{figure}[ht]
\centering
\begin{tikzpicture}
\begin{axis}[xmin=0,xmax=100] %,ytick=\empty]
%using my macro -> label position is wrong
\labeledRange{10}{20}{LABEL 1}
\labeledRange{60}{70}{LABEL 2}
%without macro -> works fine
\addplot coordinates {(20,3) (50,3)};
\node[coordinate, pin=right:{LABEL 3}]
at (axis cs:50,3) {};
\end{axis}
\end{tikzpicture}
\end{figure}
\end{document}
Antwort1
TikZ-Befehle wie \node
und \draw
werden \path
innerhalb einer axis
Umgebung nicht sofort ausgeführt, sondern gesammelt und dann ausgeführt, nachdem alle Diagramme fertig sind. Dies ist notwendig, damit Dinge wie das axis cs:
Koordinatensystem funktionieren (da spätere Diagramme die Achsenbereiche noch ändern könnten, ist das Koordinatensystem erst festgelegt, wenn alle Diagramme angegeben wurden). Aus diesem Grund verwenden alle Ihre Beschriftungen denselben letzten Wert des Zählers.
Anstatt einen separaten \node
Befehl zu verwenden, können Sie vor Ihrem Befehl node ...
(ohne ) einfügen . Auf diese Weise wird der Knoten automatisch am Ende des Plots platziert.\
;
\addplot
Die dünnen Linien entstehen durch Ihre Verwendung von pin
. Sie könnten stattdessen verwenden label
, was wie funktioniert, pin
aber ohne die Verbindungslinie. Oder, was in diesem Fall viel besser ist, vermeiden Sie die Verwendung von pin
und label
ganz und verwenden Sie einfach node
direkt das.
\documentclass{article}
\usepackage{pgfplots}
\begin{document}
%\labeledRange{start}{end}{label}
\newcounter{vertposition}
\newcommand{\labeledRange}[3]{
\addplot coordinates {(#1,\arabic{vertposition}) (#2,\arabic{vertposition})} node [black,anchor=west] {#3};
\stepcounter{vertposition}
}
\begin{figure}[ht]
\centering
\begin{tikzpicture}
\begin{axis}[xmin=0,xmax=100] %,ytick=\empty]
%using my macro
\labeledRange{10}{20}{LABEL 1}
\labeledRange{60}{70}{LABEL 2}
%without macro
\addplot coordinates {(20,3) (50,3)};
\node[coordinate, label=right:{LABEL 3}]
at (axis cs:50,3) {};
\end{axis}
\end{tikzpicture}
\end{figure}
\end{document}