Elrond” post=63738In questi giorni sto sperimentando l’accoppiata pgfplots e gnuplot per realizzare i grafici di funzioni. Preferisco usare gnuplot per calcolare le coordinate per gli stessi motivi espressi nel manuale di pgfplots (gli svantaggi di gnuplot lì riportati non sono, per me, un problema), in particolare perché gnuplot ne capisce un po’ di più di matematica rispetto a pgfplots. Per esempio basta provare a rappresentare la funzione seno cardinale
`\begin{tikzpicture}
\begin{axis}
\addplot gnuplot [mark=none,blue] {sin(x)/x};
\addplot [mark=none,red] {sin(rad(x))/(rad(x))};
\end{axis}
\end{tikzpicture}`Per x=0 pgfplots (curva rossa) va a 0, mentre dovrebbe valere a 1, così come fa giustamente gnuplot. Inoltre in PGF ho problemi con l’operatore ternario di selezione `? :’, mentre con gnuplot mi funziona correttamente (ma magari di questo ne parlerò un’altra volta, se ne avrò ancora bisogno).Il mio problema è però un altro. Ieri ho scoperto, girando su internet, che è possibile passare come argomento di `\addplot gnuplot’ uno script gnuplot usando l’opzione `raw gnuplot’ ad `\addplot gnuplot’. Faccio notare che questa possibilità non è particolarmente ben documentata nel manuale di pgfplots. Lì infatti c’è scritto solo
/tikz/raw gnuplot (no value)
Disables the use of samples and domain.A parte ciò, in uno script gnuplot è possibile rappresentare più curve con un solo comando `plot’ e utilizzando lo stesso “preambolo” (per usare il gergo LaTeX) per tutte queste curve. Mi sembra di capire che `\addplot’ può, invece, rappresentare una sola curva alla volta (cioè per rappresentare più curve bisogna usare un `\addplot’ per ciascuna curva) e qui sorgono le mie difficoltà. Infatti io vorrei rappresentare con `\addplot gnuplot {script gnuplot}’ due curve che condividono lo stesso “preambolo”, ma l’unica soluzione che ho trovato è fare qualcosa di questo tipo
`\begin{tikzpicture}
\begin{axis}
\addplot [raw gnuplot,mark=none,red] gnuplot {
…preambolo…
plot funzione
};
\addplot [raw gnuplot,mark=none,blue] gnuplot {
…stesso preambolo di prima…
plot altra-funzione
};
\end{axis}
\end{tikzpicture}`Potete immaginare quanto sia scomoda una soluzione del genere, soprattutto se si deve modificare spesso il preambolo (e magari le curve non sono solo due). Avete delle soluzioni migliori? Avevo pensato di utilizzare un comando LaTeX definito con `\newcommand’ in cui inserire il “preambolo” e utilizzare dentro allo `script’, ma
1. non mi funziona, anche se potrei aver commesso degli errori io (se c’è bisogno posso fornire un esempio minimo compilabile);
2. non so quanto sia corretta una soluzione del genere.P. S. preciso una cosa per quanto riguarda il formato dello script gnuplot che si può passare a `\addplot gnuplot {script}’. Prima di produrre il file *.pgf-plot.gnuplot, pgfplots (o chi per lui)
– sostituisce tutti i newline presenti in `script’ con uno spazio;
– elimina tutti gli spazi consecutivi multipli lasciandone solo uno;
– ignora tutti i commenti in formato LaTeX, cioè che iniziano con `%’.
Questo comporta che ogni riga dello `script’ deve essere terminata da un punto e virgola `;’, non si possono usare i commenti nel formato gnuplot, cioè con `#’ (altrimenti tutto quello che si trova dopo nello `script’ verrà ignorato) e non bisogna effettuare l’escape dei newline con il backslash perché, come detto, i newline vengono sostituiti dagli spazi. Faccio quindi un semplice esempio pratico
`\begin{tikzpicture}
\begin{axis}
\addplot gnuplot [raw gnuplot,blue,mark=none] {f(a,omega,x)=a*sin(omega*x);
a=4; % questo commento non comparirà nel file *.pgf-plot.gnuplot
omega=1./2.;
plot [0:4*pi] f(a,omega,x)};
\end{axis}
\end{tikzpicture}`
Ciao Elrond,
ovvio che dipende dalle tue esigenze, ma generalmente tendo ad utilizzare lo strumento migliore per quel dato problema.
In sostanza usare pgfplots per creare il grafico ed il programma matematico adatto per creare i numeri.
Gnuplot è utilizzato proprio in questo modo da pgfplots, infatti vengono creati i file di testo con le coordinate da gnuplot e “plottate” da pgfplots.
Alcune considerazioni su questo argomento le troverai al prossimo imminente GuIT meeting…
Se ritieni migliore un approccio a singolo passaggio, potresti considerare di trattare pgfplots come backend di plottaggio rispetto ad un codice numerico, per esempio scritto in Python.
Ecco un paio di esempi: https://github.com/lucastheis/pypgf e https://github.com/nschloe/matplotlib2tikz
La libreria numpy di Python è piuttosto interessante ed efficiente.
Ti ringrazio per la segnalazione.
Ciao