Счетчик не работает должным образом в pgfplot

Счетчик не работает должным образом в pgfplot

Используя pgfplot (впервые), я пытаюсь создать диаграмму с горизонтальными полосами, что-то вроде того. Смотрите рисунок.

введите описание изображения здесь

Я знаю, как это сделать, но поскольку код довольно многословен, а у меня много данных, я вынес повторяющиеся части в макрос под названием \labeledRange{beginpos}{endpos}{label}. Я также использовал счетчик ( vertposition), чтобы избавиться от ручного указания вертикального положения (так как я хочу, чтобы оно увеличивалось для каждого диапазона). Однако счетчик ведет себя не так, как я ожидаю, когда используется в команде \nodeв коде ниже. На рисунке выше метки LABEL1и LABEL 2 должны быть около синей и красной полосы соответственно.

Как мне это сделать?

(И еще одна маленькая проблема: как избавиться от линии «булавки»?)

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

Связанный контент