El contador no funciona como se esperaba en pgfplot

El contador no funciona como se esperaba en pgfplot

Usando pgfplot (por primera vez), intento crear un gráfico con barras horizontales, más o menos. Ver la figura.

ingrese la descripción de la imagen aquí

Sé cómo hacerlo, pero como el código es bastante detallado y tengo muchos datos, he eliminado las partes repetitivas en una macro llamada \labeledRange{beginpos}{endpos}{label}. También he usado un contador ( vertposition) para deshacerme de especificar manualmente la posición vertical (ya que quiero que se incremente para cada rango). Sin embargo, el contador no se comporta como esperaba cuando se usa en un \nodecomando del código siguiente. En la figura anterior, las etiquetas LABEL1y LABEL 2 deben estar cerca de la barra azul y roja respectivamente.

¿Cómo puedo hacer que esto funcione?

(Y, como otro pequeño problema, ¿cómo puedo deshacerme de la línea 'pin'?)

\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}

Respuesta1

Los comandos de TikZ como \nodey \drawdentro \pathde un axisentorno no se ejecutan inmediatamente, sino que se recopilan y luego se ejecutan una vez finalizados todos los trazados. Esto es necesario para que cosas como el axis cs:sistema de coordenadas funcionen (debido a que los gráficos posteriores aún podrían alterar los rangos de los ejes, el sistema de coordenadas no se fija hasta que se hayan especificado todos los gráficos). Debido a esto, todas sus etiquetas usan el mismo último valor del contador.

En lugar de utilizar un \nodecomando separado, puede insertar node ...(sin \) antes ;de su \addplotcomando. De esa forma, el nodo se colocará automáticamente al final del gráfico.

Las líneas finas son causadas por el uso de pin. En su lugar, podrías usar label, que funciona igual pinpero sin la línea de conexión. O, mucho mejor en este caso, evite el uso de piny labelpor completo y utilice nodedirectamente el.

\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}

información relacionada