Der Zähler funktioniert in pgfplot nicht wie erwartet

Der Zähler funktioniert in pgfplot nicht wie erwartet

Ich verwende pgfplot (zum ersten Mal) und versuche, eine Art Diagramm mit horizontalen Balken zu erstellen. Siehe Abbildung.

Bildbeschreibung hier eingeben

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 \nodeBefehl im folgenden Code verwendet wird. In der obigen Abbildung sollten die Beschriftungen LABEL1und 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 \nodeund \drawwerden \pathinnerhalb einer axisUmgebung 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 \nodeBefehl 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, pinaber ohne die Verbindungslinie. Oder, was in diesem Fall viel besser ist, vermeiden Sie die Verwendung von pinund labelganz und verwenden Sie einfach nodedirekt 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}

verwandte Informationen