
Usando o pgfplot (pela primeira vez), tento criar um gráfico com barras horizontais, mais ou menos. Veja a figura.
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 \node
comando no código abaixo. Na figura acima, os rótulos LABEL1
e 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 \node
e \draw
dentro \path
de um axis
ambiente 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 \node
comando separado, você pode inserir node ...
(sem \
) antes ;
do seu \addplot
comando. 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 pin
e label
e use apenas node
diretamente.
\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}