Gnuplot, grafici Open Source

Gnuplot è un software che permette di disegnare funzioni e serie di dati in 2D e 3D. I grafici possono essere generati in numerosi formati, inoltre è disponibile per molte piattaforme (UNIX, IBM OS/2, MS Windows, DOS, Macintosh, VMS, Atari).

Da una shell digitiamo:

gnuplot

in questo modo si entra nella shell interattiva di Gnuplot.

Comandi principali

set terminal NOME_TERMINALE

serve per impostare il tipo di output da generare. Di default c'è x11, ma si possono scegliere tra varie opzioni, ciascuna con i suoi argomenti. Esiste la possibilità di creare file jpeg, png, postscript ecc. L'help in linea

help COMANDO

sarà di sicuro un valido aiuto per ottenere le informazioni desiderate.
Interessante è la possibilità di scegliere latex per ottenere il codice da includere in un documento LaTeX.

set output "NOME_FILE"

permette di salvare l'output di Gnuplot nel file specificato.

set key

attiva la legenda in alto a destra, salvo diverse indicazioni di posizione. Infatti, aggiungendo left, bottom, right o una coordinata è possibile farla comparire dove si desidera.
Se non la si vuole visualizzare, invece, basterà specificarlo tramite

unset key

Le etichette della legenda vengono generate automaticamente, salvo diverse indicazioni che si effettuano tramite degli argomenti del comando

plot

Comando che serve per disegnare grafici 2D.

Per impostare la griglia, non presente di default, su entrambi gli assi si usa il comando

set grid

e

unset grid

la elimina.

A questo punto è evidente come il comando

set COMANDO

serve per impostare COMANDO, mentre

unset COMANDO

serve per riportare Gnuplot a lavorare nelle condizioni precedenti all'utilizzo di COMANDO.

Tramite

set ASSErange [INIZIO:FINE]

è possibile impostare il range dell'asse specificato al posto di ASSE (x, y ecc), che, altrimenti, è definito in automatico da Gnuplot. Se al posto di numeri vengono inseriti degli * come INIZIO e FINE, allora si ripristina l'autoscala.

set logscale ASSE BASE

permette di impostare la scala logaritmica per l'asse indicato oppure per tutti se non si specifica nulla. La base del logaritmo è di default 10.

set format ASSE "FORMATO"

imposta il formato dell'asse specificato (o di entrambi in caso contrario), che di default è "%g"(cioè Gnuplot visualizza i numeri nel formato più corto tra l'esponenziale,"%e", e in virgola mobile, "%f"). Se, per esempio, si vuole visualizzare in formato esponenziale con una cifra prima della virgola e due dopo, basterà usare

"%1.2e"

analogamente per gli altri formati possibili.

set title "TITOLO"

definisce il titolo del grafico. Anche qui sono possibili molteplici opzioni come colore, grandezza, font, posizione ecc.

set ASSElabel "NOME"

imposta l'etichetta dell'asse specificato.

Se si è scelto l'output grafico in LaTeX è possibile ruotare verticalmente il testo dell'asse y che, altrimenti, risulterebbe orizzontale, con l'accortezza di aggiungere il comando per ruotare di 90 gradi l'etichetta.

set ylabel "\\rotatebox{90}{NOME}">

La specifica

\\rotatebox{}{}

è un comando LaTeX che verrà poi interpretato durante la compilazione del file .tex. Sono necessarie due \, in quanto una sola verrebbe interpretata da Gnuplot. Essa infatti serve per spezzare un comando su più righe.

plot "NOME_FILE_DATI" title "ETICHETTA LEGENDA" using NUM1:NUM2 with STILE

permette di creare il grafico a partire dai dati contenuti nel file NOME_FILE_DATI, usando le colonne NUM1 e NUM2, utilizzando uno certo stile e con una specifica etichetta per la legenda. Queste opzioni sono, ovviamente, solo alcune delle possibili.

Il file contenente i dati dovrà contenere almeno una colonna, la quale corrisponderà all'asse delle ordinate. In caso di due colonne, la prima sarà associata all'asse x e la seconda all'asse y. In questi due casi il parametro using non sarà necessario.

Se si hanno più serie di dati da visualizzare sullo stesso grafico, esse possono essere organizzate in due modi: mettendo le due serie di dati in successione, separate da una riga bianca, oppure impostando il file dati come una matrice.
Nel primo caso il file apparirà come segue

#PRIMA SERIE
1 1
2 2
3 3
4 4
5 5

#SECONDA SERIE
2 4
3 6
4 8
5 10

dove le righe precedute dal # saranno interpetate come dei commenti da parte di Gnuplot.

plot "NOME_FILE.dat"

plotterà due linee corrispondenti alle due serie di dati.
Nel secondo caso, invece, il file apparirà così:

1 1 2 4
2 2 3 6
3 3 4 8
4 4 5 10
5 5

e usando lo stesso comando di prima per plottare, potremmo vedere visualizzata solo la prima serie di dati in quanto è come se ci fossero solo le prime due colonne di dati.
Per visualizzare le due serie dovremmo indicarle tramite il comando using NUM1:NUM2 ovvero:

plot "NOME_FILE.dat" using 1:2, "NOME_FILE.dat"  using 3:4

separando con una virgola le serie di dati che vogliamo graficare. Con il primo pezzo indichiamo di usare la colonna 1 come ascissa e la 2 come ordinata, con il secondo diciamo di assumere la colonna 3 come x e la 4 come y. Ovviamente potremmo anche avere un'unica colonna delle ascisse nel nostro file dati e più colonne per l'asse y, l'importante è specificare correttamente "cosa corrisponde a quale asse" con il comando plot. È possibile anche graficare serie di dati provenienti da file dati diversi: basta indicare correttamente i due nomi.

Se si vuole interpolare una serie di dati, esiste il comando fit. Innanzitutto si può definire il tipo di funzione su cui fare l'interpolazione:

f(x) = a*x + b

se si desidera un andamento lineare,

f(x) = a* exp (x/b)

per un'esponenziale ecc.

fit f(x) 'NOME_FILE.dat' via a,b

permette a Gnuplot di interpolare i dati contenuti nel file NOME_FILE.dat precedentemente creato da noi per mezzo dei parametri a e b che verranno calcolati e comunicati a video e in un file fit.

plot f(x)

realizzerà un grafico con l'interpolazione così ottenuta.

Se non si desidera digitare volta per volta tutta questa serie di comandi da prompt di comando, è possibile salvare il tutto in un file da mandare in esecuzione tramite

load 'NOME_FILE'

Oppure, senza entrare nel prompt di Gnuplot, è possibile digitare

gnuplot "NOME_FILE"

per far eseguire da Gnuplot il contenuto di NOME_FILE, ma se non si è impostato di salvare l'output esso viene aperto e automaticamente chiuso, perché l'ambiente di Gnuplot si chiude con l'ultimo comando del file.

Digitando:

set terminal jpeg medium size 640,480
set output "seno.jpeg"
unset key
plot [x=-pi:+pi] sin(x)

Nota: In questo caso il comando plot genera la funzione seno da meno a più pi greco. Costanti come pi greco sono già conosciute da Gnuplot e quindi basta richiamarle col loro nome.

otterremo questo file di output:

Grafico Seno (GNUPLOT)

Se abbiamo creato il file dati.dat con i valori scritti prima, salvando in un file prova il seguente codice:

set terminal jpeg medium size 640,480
set output "daFile.jpeg"
set key left
plot "dati.dat" using 1:2 title "serie uno" with linespoints 1, "dati.dat"  u 3:4 t "serie due" w lp 2
# using può essere abbreviato con il comando u
# title con  t
# with con w
# linespoints con lp

otterremo, invece, questo risultato:

Grafico serie (GNUPLOT)

set terminal latex
set output "daFile.tex"
set key left
plot "dati.dat" u 1:2 t "serie uno" w lp 1, "dati.dat"  u 3:4 t "serie due" w lp 2

otterremo il file daFile.tex col seguente codice

% GNUPLOT: LaTeX picture
\setlength{\unitlength}{0.240900pt}
\ifx\plotpoint\undefined\newsavebox{\plotpoint}\fi
\sbox{\plotpoint}{\rule[-0.200pt]{0.400pt}{0.400pt}}%
\begin{picture}(1500,900)(0,0)
\sbox{\plotpoint}{\rule[-0.200pt]{0.400pt}{0.400pt}}%
\put(120.0,82.0){\rule[-0.200pt]{4.818pt}{0.400pt}}

...

\end{picture}

Questo file può essere usato in un documento LaTeX, dopo aver aggiunto, nel preambolo del file .tex, i seguenti pacchetti

\usepackage{graphicx}
\usepackage{latexsym}

Mentre il semplice:

\input{PERCORSO\FILE}

permetterà di inserire il file generato da Gnuplot.

Il file che si ottiene con queste impostazioni non presenta la possibilità di usare i colori, perché per LaTeX non è prevista quest'opzione, quindi Gnuplot non inserirà informazioni a riguardo nell'output.
Bisogna quindi passare all'utilizzo di una macro di LaTeX, con:

set terminal eepic

Nel preambolo del file LaTeX dovranni essere inserite le seguenti righe:

\usepackage{eepic,epic,eepicemu}
\usepackage{color}

E' necessario avere i giusti pacchetti installati. Si può scaricare da qui il file zip di eepic. Per installarlo è necessario copiare nella directory di LaTeX contenente tutti i file sty (/usr/share/texmf-texlive/tex/latex per me, per esempio) e aggiornare l'ambiente LaTeX con il comando:

texhash

Tuttavia l'uso di questa macro, alquanto datata (i riferimenti sono tutti precedenti al 2000), va bene con un buon lettore di dvi per non incorrere in risultati "strani".

Beh, buon lavoro a tutti! :)

scusa per i grafici di dati è possibile usare più di 10 colonne? ti spiego il perchè della domanda...il grafico viene ma i colori si ripetono..come mai?grazie..bella guida

Grazie. :)

Ovviamente sì, non ci sono limiti in termini di colonne sia perché puoi cambiare tipo di linea (e non solo colore), sia perché puoi specificare tu i colori per ogni singola linea, sia perché puoi eventualmente variare lo spessore delle linee. Insomma, le combinazioni possibili per differenziare le linee sono molteplici.

L'associazione del colore dipende, immagino, da impostazioni di gnuplot, ma anche dal terminale impostato. Per esempio, se tu digiti da riga di comando help color_resource puoi leggere com'è la successione dei colori in X11 (che, di default comprende 8 valori numerici con 8 colori corrispondenti; per numeri maggiori i colori ciclano nello stesso ordine... da qui il tuo problema).

Sinceramente non mi sono mai posta il problema, ma per risolvere la questione, puoi sempre indicare il colore mediante il comando linecolor rgb 'NOME_COLORE'. Per vedere i nomi dei colori disponibili basta che digiti show palette color, che ti permette di identificare anche i codici rgb e in esadecimale dei colori indicati.

Per ulteriori dettagli a proposito di colori, ti consiglio di leggere la guida di gnuplot o utilizzare l'help da riga di comando.

ciao,
io devo fare il grafico di 50 liste di 10 punti ciascuna. le ho in questo formato

Lista1:=[[1,2],[3,4],[4,5],[6,7],[0,9],[8,7],[4,5],[7,6],[4,5],[2,3]];
Lista2:= ...

Lista50:=...

come posso fare il plot? possibilmente usando un po' di colori diversi?
Grazie

Per la questione colori non c'è alcun problema: ogni serie di dati avrà il suo colore e al limite lo puoi scegliere tu (vedi commenti precedenti).
Per fare i grafici con gnuplot credo che tu debba manipolare il formato dei dati per ottenere quanto presentato nell'inserimento.
Altrimenti non ti resta che provare a cercare meglio, io sinceramente non ho mai visto dati per gnuplot formattati in questo modo.

grazieeeeeeeeeeeeeeeeeeeeee

Salve a tutti, volevo porvi un quesito. Sono sulla shell, scrivo gnuplot e fin qui tutto ok...se scrivo plot e il nome del file da plottare mi dice che non trova il file...sto uscendo pazzo..il file si trova in una cartella, TRPR, e quando eseguo gnuplot lo eseguo proprio stando su questa cartella, ma sto file non lo trova..come fare???

gnuplot> plot -persist plot_rx.txt
undefined variable: persist

gnuplot> plot plot_rx.txt
undefined variable: plot_rx

daniele@ubuntu:~/Scrivania/TRPR$ ls
hcat.cpp plot_rx.txt README.TXT trpr Trpr.dsp trpr.html
Hcat.dsp plot_rx.txt~ rx_log.txt trpr.cpp Trpr.dsw Trpr.opt
daniele@ubuntu:~/Scrivania/TRPR$

Il file da plottare è plot_rx.txt!!!

Il nome del file deve essere inserito tra virgolette come dagli esempi scritti nel post, altrimenti plot cerca una variabile che deve essere stata inizializzata precedentemente.

Digita

help plot

dalla shel di GNUplot per avere altri esempi.

se ho dei dati ordinati per righe anziché per colonne come posso graficare in modo tale che gnuplot legga ad esempio la prima riga come asse x e la seconda riga come asse y?

Ciao a tutti, io ho un file di testo in formato .ADD e dei dati che sono contenuti al suo interno , che sono davvero tanti vorrei fare un grafico in cui le coordinate sono il tempo e lo spazio.
In ogni file .ADD tutte le colonne rappresentano una data posizione mentre l'ultima colonna rappresenta il tempo; come posso fare?
Leggendo dalla guida ho dedotto che il mio file di origine deve essere prima trasformato in uno .dat e poi credo di dover usare il comando

gnuplot> "nome_file.dat" using 1:6 , "nome_file.dat" using 2:6

ho ipotizzato che la colonna 6 sia quella che contiene il tempo

ma lo script completo per creare un grafico come quello che vorrei quale potrebbe essere?