
Tengo un conjunto de datos para trazar donde me gustaría grupos de N trazados consecutivos con el mismo estilo. Opciones que he considerado:
- Puedo definir un nuevo
cycle list
a mano - Puedo usar
forget plot
- Puedo usar el
cycle list shift
como entrazar dos líneas en el mismo estilo
Aquí hay un ejemplo, con dos grupos de 3 gráficos, que hace lo que quiero usando este último método:
\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}
Me gustaría algo más limpio y automatizado, tal vez con este tipo de sintaxis:
cycle multi list={%
color list\nextlist
[5 of]mark list
}
¡Pero no puedo entender cómo!
Editar: tampoco puedo encontrar un método adecuado para construir la leyenda, con solo cada N gráficos también.
Respuesta1
Por lo que he visto, interpretaste la respuesta desde la percusión hasta¿Cómo puedo trazar dos líneas con el mismo estilo (usando listas de ciclos) con pgfplots?incorrectamente. No debe agregar los gráficos de un grupo y luego del siguiente, y así sucesivamente. Debes agregar el primer gráfico de todos los grupos, luego el segundo y así sucesivamente:
\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>}
Pero esto se puede convertir en un entorno, vea si esto funciona para usted (tenga en cuenta que para obtener la leyenda correcta, simplemente agregue leyendas a los primeros gráficos, como se muestra a continuación):
\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}
EDITAR
De hecho, puedes usar cycle multi list
tal como mencionaste:
cycle multi list={color\nextlist [N of]mark list}
Un inconveniente de este método son las leyendas, no pude hacerlo funcionar pero con las entradas deStefan Pinnowen los comentarios a continuación es posible proporcionar leyendas vacías para las tramas que tienen el mismo estilo (con la excepción de una, por supuesto).
\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}
Respuesta2
Creo que usar la forget plot
función da como resultado una solución bastante simple...
Pero como no proporcionó ninguna tabla de datos ficticia ni nos dijo de dónde provienen las entradas de su leyenda, solo le doy un ejemplo aquí, que con suerte podrá adaptar a sus necesidades. De lo contrario, sea más específico en la pregunta y edítela en consecuencia.
Para obtener más detalles sobre cómo funciona la solución, consulte los comentarios en el código.
% 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}