
Usando pgfplot (por primera vez), intento crear un gráfico con barras horizontales, más o menos. Ver la figura.
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 \node
comando del código siguiente. En la figura anterior, las etiquetas LABEL1
y 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 \node
y \draw
dentro \path
de un axis
entorno 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 \node
comando separado, puede insertar node ...
(sin \
) antes ;
de su \addplot
comando. 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 pin
pero sin la línea de conexión. O, mucho mejor en este caso, evite el uso de pin
y label
por completo y utilice node
directamente 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}