O contador não funciona conforme esperado no pgfplot

O contador não funciona conforme esperado no pgfplot

Usando o pgfplot (pela primeira vez), tento criar um gráfico com barras horizontais, mais ou menos. Veja a figura.

insira a descrição da imagem aqui

Eu sei como fazer isso, mas como o código é bastante detalhado e tenho muitos dados, fatorei as partes repetitivas em uma macro chamada \labeledRange{beginpos}{endpos}{label}. Também usei um contador ( vertposition) para me livrar da especificação manual da posição vertical (pois quero que ele aumente para cada intervalo). No entanto, o contador não se comporta como esperado quando usado em um \nodecomando no código abaixo. Na figura acima, os rótulos LABEL1e LABEL 2 devem estar próximos à barra azul e vermelha respectivamente.

Como posso fazer isso funcionar?

(E, como outro pequeno problema, como posso me livrar da linha do 'alfinete'?)

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

Responder1

Comandos TikZ como \nodee \drawdentro \pathde um axisambiente não são executados imediatamente, mas coletados e executados após todas as plotagens serem concluídas. Isto é necessário para fazer coisas como o axis cs:sistema de coordenadas funcionar (como gráficos posteriores ainda podem alterar os intervalos dos eixos, o sistema de coordenadas não é fixo até que todos os gráficos tenham sido especificados). Por causa disso, todos os seus rótulos usam o mesmo último valor do contador.

Em vez de usar um \nodecomando separado, você pode inserir node ...(sem \) antes ;do seu \addplotcomando. Dessa forma, o nó será colocado automaticamente no final da plotagem.

As linhas finas são causadas pelo uso de pin. Em vez disso, você poderia usar label, que funciona como pin, mas sem a linha de conexão. Ou, muito melhor neste caso, evite o uso de pine labele use apenas nodediretamente.

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

informação relacionada