
Используя 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}