
У меня есть набор данных для построения графика, где я хотел бы получить группы из N последовательных графиков с одинаковым стилем. Варианты, которые я рассматривал:
- Я могу определить новое
cycle list
вручную - я могу использовать
forget plot
- Я могу использовать
cycle list shift
как впостроить две линии в одном стиле
Вот пример с двумя группами по 3 графика, который делает то, что мне нужно, используя этот последний метод:
\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
]
% First group of identical plots
\addplot+ [domain=-1:2, samples=10] {1*x+1};
\pgfplotsset{cycle list shift=-1}
\addplot+ [domain=-1:2, samples=10] {1*x+2};
\pgfplotsset{cycle list shift=-2}
\addplot+ [domain=-1:2, samples=10] {1*x+3};
% Second group of identical plots
\addplot+ [domain=-1:2, samples=10] {2*x+1};
\pgfplotsset{cycle list shift=-3}
\addplot+ [domain=-1:2, samples=10] {2*x+2};
\pgfplotsset{cycle list shift=-4}
\addplot+ [domain=-1:2, samples=10] {2*x+3};
% and so on... I have a dozen of sets of 5 plots. It would get tedious.
\end{axis}
\end{tikzpicture}
\end{document}
Мне бы хотелось чего-то более чистого и автоматизированного, возможно, с таким синтаксисом:
cycle multi list={%
color list\nextlist
[5 of]mark list
}
Но я не могу понять как!
Редактировать: Я не могу придумать правильный метод построения легенды, учитывая, что у меня есть только N участков.
решение1
Насколько я понял, вы интерпретировали ответ с ударных наКак построить две линии в одном стиле (используя циклические списки) с помощью pgfplots?неправильно. Вы не должны добавлять участки для одной Группы, а затем для следующей Группы и так далее. Вы должны добавить первый участок всех Групп, затем второй и так далее:
\addplot 1 from Group 1
\addplot 1 from Group 2
\addplot 1 from Group 3
\addplot 1 from Group 4 ... then
\pgfplotsset{cycle list shift=-<number of Groups>}
Но это можно превратить в среду, посмотрите, подойдет ли вам это (обратите внимание, что для правильной легенды просто добавьте легенды к первым графикам, как показано ниже):
\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
\newcounter{plotscount}\setcounter{plotscount}{0}
\newcommand*{\nextplots}{\stepplots\pgfplotsset{cycle list shift=-\theplotscount}}
\newenvironment{groupofplots}[1]{\def\stepplots{\addtocounter{plotscount}{#1}}}{\setcounter{plotscount}{0}}
\begin{document}
\begin{tikzpicture}
\begin{axis}[domain=-1:2, samples=10]
% First plot of each group
\begin{groupofplots}{2}
\addplot {1*x+1};\addlegendentry{Style 1}
\addplot {2*x+1};\addlegendentry{Style 2}
% Second plot of each group
\nextplots
\addplot {1*x+2};
\addplot {2*x+2};
% Third plot of each group
\nextplots
\addplot {1*x+3};
\addplot {2*x+3};
\end{groupofplots}
\end{axis}
\end{tikzpicture}
\end{document}
РЕДАКТИРОВАТЬ
На самом деле вы можете использовать cycle multi list
именно то, что вы упомянули:
cycle multi list={color\nextlist [N of]mark list}
Недостатком этого метода являются легенды, я не смог заставить его работать, но с вводными данными отСтефан ПинновВ комментариях ниже можно предоставить пустые легенды для сюжетов, имеющих одинаковый стиль (за исключением одного, конечно).
\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
domain=-1:2,
samples=10,
cycle multi list={color\nextlist [3 of]mark list}]
\addplot {1*x+1};
\addplot {1*x+2};
\addplot {1*x+3};
\addplot {2*x+4};
\addplot {2*x+5};
\addplot {2*x+6};
\addplot {3*x+7};
\addplot {3*x+8};
\addplot {3*x+9};
\legend{Style 1,,,Style 2,,,Style 3}
\end{axis}
\end{tikzpicture}
\end{document}
решение2
Я думаю, что использование этой forget plot
функции приводит к довольно простому решению...
Но поскольку вы не предоставили какую-либо фиктивную таблицу данных и не сообщили нам, откуда берутся ваши записи легенды, я просто привожу здесь пример, который вы, надеюсь, сможете адаптировать под свои нужды. В противном случае, пожалуйста, будьте более конкретны в вопросе и отредактируйте его соответствующим образом.
Более подробную информацию о том, как работает решение, можно найти в комментариях в коде.
% used PGFPlots v1.14
% just some dummy data
\begin{filecontents}{test.txt}
x g1p1 g1p2 g1p3 g2p1 g2p2 g2p3 g3p1 g3p2
0.0 0.00 0.25 0.50 1.00 1.25 1.50 2.00 2.25
0.5 0.25 0.50 0.75 1.50 1.75 2.00 3.00 3.25
1.0 0.50 0.75 1.00 2.00 2.25 2.50 4.00 4.25
1.5 0.75 1.00 1.25 2.50 2.75 3.00 5.00 5.25
2.0 1.00 1.25 1.50 3.00 3.25 3.50 6.00 6.25
2.5 1.25 1.50 1.75 3.50 3.75 4.00 7.00 7.25
\end{filecontents}
\documentclass[border=5pt]{standalone}
% to provide the `\ifnumequal' command
% (inspired by <http://texwelt.de/wissen/fragen/5066>)
\usepackage{etoolbox}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
legend pos=north west,
]
% loop through the groups
\foreach \g in {1,...,2} {
% loop through the plots of the group
\foreach \p [count=\pi] in {1,...,3} {
% if the current plot loop is the last one, i.e. no 3
% then don't forget the plot and add the legend entry
\ifnumequal{\pi}{3}{
\addplot table [x=x,y=g\g p\p] {test.txt};
\addlegendentryexpanded{g\g p\p}
% else forget the plot
% (that means, use the current cycle list style without
% increasing the counter and don't account for a legend
% entry)
}{
\addplot+ [forget plot]
table [x=x,y=g\g p\p] {test.txt};
}
}
}
% here the same in for your last special case where no
% "group" loop is needed any more
\foreach \p [count=\pi] in {1,...,2} {
\ifnumequal{\p}{2}{
\addplot table [x=x,y=g3p\p] {test.txt};
\addlegendentryexpanded{g3p\p}
}{
\addplot+ [forget plot]
table [x=x,y=g3p\p] {test.txt};
}
}
\end{axis}
\end{tikzpicture}
\end{document}