pgfplot 中的计数器未按预期工作

pgfplot 中的计数器未按预期工作

使用 pgfplot(第一次),我尝试创建一个带有水平条的图表。参见图。

在此处输入图片描述

我知道该怎么做,但因为代码太冗长,而且我有大量数据,所以我在一个名为 的宏中分解出了重复部分\labeledRange{beginpos}{endpos}{label}。我还使用了计数器 ( vertposition) 来摆脱手动指定垂直位置(因为我希望它在每个范围中递增)。但是,当\node在下面的代码中用作命令时,计数器的行为并不像我预期的那样。在上图中,标签LABEL1LABEL 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\pathaxisaxis cs:

无需使用单独的\node命令,您可以在命令前插入(不node ...带) 。这样,节点将自动放置在图的末尾。\;\addplot

细线是由于您使用了 造成的pin。您可以改用label,其工作原理类似pin,但没有连接线。或者,在这种情况下,更好的方法是完全避免使用pinlabel,而直接使用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}

相关内容