Pgfplots e gnuplot

  • Creatore
    Topic
  • #64675
    Up
    0
    Down
    ::


    In 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}`

Visualizzazione 2 filoni di risposte
  • Autore
    Risposte
    • #64676
      robitex
      Amministratore del forum
        Up
        0
        Down
        ::

        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

      • #64677
        Up
        0
        Down
        ::

        robitex” post=63746Ciao 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

        Grazie. Purtroppo non conosco Python, quindi l’alternativa che hai suggerito non è praticabile per me (spero in futuro di imparare un po’ di Python, ma sono così tanti i linguaggi che vorrei studiare che alla fine non ne studio nessuno :D).

        Prima di utilizzare TikZ usavo gnuplot con il terminale epslatex. Ero abbastanza soddisfatto ma gnuplot decisamente non è adatto a fare disegni che non siano grafici di funzioni, al contrario di TikZ. Poi ho iniziato a notare qualche limite di gnuplot, per esempio trovo scomodo cambiare le dimensioni di una figura, devo cambiare lo script, mentre con pgfplots (e anche TikZ) è sufficiente modificare le opzioni dell’ambiente tikzpicture (in questo modo posso riciclare una figura che salvo in un file diverso da quello che la include). Gnuplot ha il terminale lua/TikZ, ma quando mi ero compilato gnuplot con il supporto per questo terminale non sapevo ancora usare TikZ, ora che conosco TikZ il pacchetto gnuplot che utilizzo al momento non ha il supporto per questo terminale 😛 Dovrei porre rimedio a questa situazione e vedere se questa soluzione mi soddisferà di più

      • #64678
        robitex
        Amministratore del forum
          Up
          0
          Down
          ::

          Elrond” post=63752

          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

          Grazie. Purtroppo non conosco Python, quindi l’alternativa che hai suggerito non è praticabile per me (spero in futuro di imparare un po’ di Python, ma sono così tanti i linguaggi che vorrei studiare che alla fine non ne studio nessuno :D).

          Prima di utilizzare TikZ usavo gnuplot con il terminale epslatex. Ero abbastanza soddisfatto ma gnuplot decisamente non è adatto a fare disegni che non siano grafici di funzioni, al contrario di TikZ. Poi ho iniziato a notare qualche limite di gnuplot, per esempio trovo scomodo cambiare le dimensioni di una figura, devo cambiare lo script, mentre con pgfplots (e anche TikZ) è sufficiente modificare le opzioni dell’ambiente tikzpicture (in questo modo posso riciclare una figura che salvo in un file diverso da quello che la include). Gnuplot ha il terminale lua/TikZ, ma quando mi ero compilato gnuplot con il supporto per questo terminale non sapevo ancora usare TikZ, ora che conosco TikZ il pacchetto gnuplot che utilizzo al momento non ha il supporto per questo terminale 😛 Dovrei porre rimedio a questa situazione e vedere se questa soluzione mi soddisferà di più

          Ciao,
          l’idea si svolgerebbe con questi passi:
          1 – scrivo un sorgente Python o Lua o Matlab, ecc che forma i file numerici in formato spazio
          2 – scrivo un sorgente LaTeX che disegna il grafico con pgfplots caricando i file di testo numerici delle coordinate

          Suggerivo Python perché per esso è disponibile la libreria numpy, ma anche Lua ha una sua libreria numerica. Mi sembra che si chiami NumLua, anche se è un progetto ancora all’inizio.
          Si possono unire i due passi o facendo creare e compilare il file tex all’interno di Python, o facendo creare la sequenza di coordinate per \addplot con la libreria standard math di Lua o con NumLua direttamente in LuaLaTeX.

          Ad ogni modo verrebbe sostituito gnuplot come “creatore di numeri” per pgfplots.

          Non conosco la qualità dei progetti su github che ti ho linkato, ma dimostrano che l’idea è già stata implementata.
          Dai un occhiata anche a questo mio post http://robitex.wordpress.com/2011/05/26/plot-della-funzione-gamma-con-matplotlib/

          Happy pgfplotting!

      Visualizzazione 2 filoni di risposte
      • Devi essere connesso per rispondere a questo topic.

      Go to top