Re: \foreach e definizione di un colore dentro {axis}

#84819
Up
0
Down
::

antonio.macrì” post=84226Ciao a tutti! 🙂

Usando TikZ, vorrei tracciare più grafici dentro un singolo ambiente axis, colorandoli però diversamente. Qualcosa come:

`% !TeX TS-program = LuaLaTeX

\documentclass[a4paper,10pt]{article}

\usepackage{amsmath}
\usepackage{pgfplots,pgfplotstable}
\usetikzlibrary{shapes.geometric,calc,intersections}
\pgfplotsset{compat=1.7}
\pgfplotstableset{format=inline, row sep=crcr}
\newcommand*\measurement[2]{%
\edef\next{\noexpand
\pgfplotstableread{\unexpanded{#2}}{\expandafter\noexpand\csname measurements#1\endcsname}
}\next
}

\begin{document}

\measurement{0}{
0 0 \\
1 397 \\
2 3415 \\
3 3629 \\
4 3811 \\
}
\measurement{1}{
0 0 \\
1 365 \\
2 884 \\
3 1341 \\
4 1768 \\
}
\measurement{2}{
0 0 \\
1 1555 \\
2 2195 \\
3 2561 \\
4 2653 \\
}

\begin{figure}
\centering
\begin{tikzpicture}
\begin{axis}[
xlabel={Packet ID},
ylabel={Cumulative dispersion ($\mu s$)},
xmin=0, ymin=0, xmax=4, ymax=4000
]
\foreach \x in {0,1,…,2} {
\xdef\R{\pdfuniformdeviate 255}
\xdef\G{\pdfuniformdeviate 255}
\xdef\B{\pdfuniformdeviate 255}
\definecolor{randomcolor}{RGB}{\R,\G,\B}
\edef\next{\noexpand
\addplot [draw=randomcolor] table from
\expandafter\noexpand\csname measurements\x\endcsname;
}\next
}
\end{axis}
\end{tikzpicture}
\end{figure}

\end{document}`

Questo codice però dà errore:

! Package xcolor Error: Undefined color `randomcolor’.

Se sostituisco [tt]randomcolor[/tt] con [tt]blue[/tt] o qualsiasi altro colore, funziona perfettamente. Anche togliendo il [tt]\foreach[/tt] va. Ho (una vaga) idea che il problema possa esser legato al fatto che axis posticipa l’esecuzione di alcune istruzioni, ma non saprei come intervenire.

È possibile risolvere in qualche modo?

Vi ringrazio,
Antonio

Io, in genere, quando vedo un [tt]\expandafter[/tt] prendo male (vuoi perché riconosco quanto siano indispensabili per certe cose, vuoi perché mi riprometto sempre di dedicare del tempo per imparare e… devo ancora trovare tempo). Quindi, questa non è una risposta proprio direttissima al problema, ma un subdolo modo per ovviare 😀

Grazie soprattutto al fatto che [tt]pgfplots[/tt] ha quella comodissima opzione [tt]cycle list[/tt] che fa il lavoro automaticamente. Quindi io avrei fatto: `
\documentclass[png,tikz,border=10pt]{standalone}

\usepackage{amsmath}
\usepackage{pgfplots}
\pgfplotsset{compat=1.7}
\pgfplotstableset{format=inline, row sep=crcr}
\newcommand*\measurement[2]{%
\edef\next{\noexpand
\pgfplotstableread{\unexpanded{#2}}{\expandafter\noexpand\csname measurements#1\endcsname}
}\next
}

\begin{document}

\measurement{0}{
0 0 \\
1 397 \\
2 3415 \\
3 3629 \\
4 3811 \\
}
\measurement{1}{
0 0 \\
1 365 \\
2 884 \\
3 1341 \\
4 1768 \\
}
\measurement{2}{
0 0 \\
1 1555 \\
2 2195 \\
3 2561 \\
4 2653 \\
}

\measurement{3}{
0 0 \\
1 675 \\
2 1864 \\
3 2322 \\
4 2512 \\
}

\pgfplotscreateplotcyclelist{wondeful-list}{
{red!65!orange},
{green!70!blue},
{blue!60!cyan},
{magenta!35!red},
{yellow!80!gray},
}

\begin{tikzpicture}
\begin{axis}[
xlabel={Packet ID},
ylabel={Cumulative dispersion ($\mu s$)},
xmin=0, ymin=0, xmax=4, ymax=4000,
cycle list name=wondeful-list,
]
\foreach \x in {0,1,…,3} {
\edef\next{\noexpand
\addplot table from
\expandafter\noexpand\csname measurements\x\endcsname;
}\next
}
\end{axis}
\end{tikzpicture}

\end{document}
` (ho inserito una misura in più per vedere come veniva quel colore 😉 ). Ovviamente non è quello che volevi tu perché la lista viene definita a priori, ma ora che conosci la chiave in teoria puoi studiarne il codice e probabilmente ricavarne le basi necessarie per creare la tua lista personalizzata (perché sai come funzionano gli [tt]\expandafter[/tt] e compagnia 😉 ).

Il risultato:

[attachment=666]x-0.png[/attachment]

Ciao
Claudio

Attachments:
You must be logged in to view attached files.

Go to top