使用 pgfplot(第一次),我尝试创建一个带有水平条的图表。参见图。
我知道该怎么做,但因为代码太冗长,而且我有大量数据,所以我在一个名为 的宏中分解出了重复部分\labeledRange{beginpos}{endpos}{label}
。我还使用了计数器 ( vertposition
) 来摆脱手动指定垂直位置(因为我希望它在每个范围中递增)。但是,当\node
在下面的代码中用作命令时,计数器的行为并不像我预期的那样。在上图中,标签LABEL1
和LABEL 2
应该分别位于蓝色和红色条附近。
我怎样才能让它工作?
(另外还有一个小问题,我怎样才能去掉‘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}
答案1
环境中的TikZ 命令(如 、和 )\node
不会立即执行,而是在所有绘图完成后收集并执行。这对于使坐标系等工作必不可少(因为后面的绘图仍可能改变轴范围,坐标系直到所有绘图都指定后才会固定)。因此,所有标签都使用相同的计数器的最后一个值。\draw
\path
axis
axis cs:
无需使用单独的\node
命令,您可以在命令前插入(不node ...
带) 。这样,节点将自动放置在图的末尾。\
;
\addplot
细线是由于您使用了 造成的pin
。您可以改用label
,其工作原理类似pin
,但没有连接线。或者,在这种情况下,更好的方法是完全避免使用pin
和label
,而直接使用node
。
\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}