Gnuplot/Plot

Come visto nell'esempio iniziale il comando per disegnare è plot.

Questi supporta un discreto numero di opzioni che ora andremo a vedere nel dettaglio

Contenuti

Sintasssi

Innanzi tutto vediamo qual'è la sintassi completa del comando

gnuplot> plot <ranges> <input> axes <axes> <title-mod> with <style>

Dove:

  • <ranges> esprime il valore degli intervalli di dominio e codominio che si vogliono raffigurare
  • <input> indica la funzione o il datafile da plottare
  • <axes> esprime per quali assi scalare la curva
  • <title-mod> precisa i modificatori per il titolo che permettono di definirne uno diverso da quello standard o di escluderlo
  • <style> definisce il particolare stile da applicare

E' anche possibile definire diverse funzioni e diversi datafile da disegnare nella medesima illustrazione, per far ciò è sufficiente intervallarli da virgole:

gnuplot> plot <input1>, <input2> ...

Parabola base

Nelle prossime righe prenderemo come punto di partenza uno dei grafi visti in precedenza, ossia la parabola generata col comando

gnuplot> plot (x**2)+(3*x)-2

Di volta in volta introdurremo nuovi particolari, descrivendo nel dettaglio le le opzioni introdotte.

In questo modo giungeremo ad ottenere un grafo completo ed elaborato.

Ranges

X-Range

Supponiamo di essere interessati ad un paricolare intervallo di valori assunti dalla variabile x, dovremo precisare l'intervallo nel seguente modo:

gnuplot> plot [<x_min>:<x_max>] <input>

Dove <x_min> e <x_max> sono due numeri che delimitano l'intervallo.
E' possibile omettere uno dei due numeri, in questo caso i comandi

gnuplot> plot [<x_min>:] <input>
gnuplot> plot [:<x_max>] <input>

raffigureranno quanto richiesto ma, nel primo caso solo per valori di x superiori a <x_min>, nell'altro solo per valori di x inferiori a <x_max>.

Di seguito riportiamo l'output dei comandi

gnuplot> plot [-4:6] (x**2)+(3*x)-2
gnuplot> plot [0:] (x**2)+(3*x)-2
gnuplot> plot [:0] (x**2)+(3*x)-2

Y-Range

Introduciamo ora dei vincoli anche sull'asse y.

Nulla di più facile, la sintassi è esattamente la stessa ma dovremo fronteggiare un altro paio di parentesi:

gnuplot> plot [<x_min>:<x_max>] [<y_min>:<y_max>] <input>

Le variabili <y_min> e <y_max> seguono la stessa logica e le stesse regole delle corrispondenti variabili x.

Se si è interessati a porre dei vincoli soltanto sul range y basterà lasciare vuoto il contenuto della prima coppia di parentesi quadre

gnuplot> plot [] [<y_min>:<y_max>] <input>

Riportiamo l'output dei comandi:

gnuplot> plot [-4:1][-5:2] (x**2)+(3*x)-2
gnuplot> plot [][0:] (x**2)+(3*x)-2

Assi

Domanda da un milione di dollari: quanti assi ci sono in un grafo bidimensionale?

Due?

Sbagliato: in realtà sono quattro.
Le figure che abbiamo incontrato sin'ora sono state tutte racchiuse in rettangoli in qui il lato inferiore presentava la scala dell'asse X, mentre quello sinistro la scala dell'asse Y.
Ma ci sono altri due lati che possiamo utilizzare. Abbiamo a disposizione una seconda coppia di assi che potremo sfruttare per avere in uno stesso disegno scale e domini differenti.
Le convenzioni usate da gnuplot per indicare gli assi sono le seguenti:

  • x1: Asse delle ascisse inferiore
  • x2: Asse delle ascisse superiore
  • y1: Asse delle ordinate sinistro
  • y2: Asse delle ordinate destro

L'argomento di axes indica come scalare la curva in maniera tale da rappresentarla meglio a sconda della coppia di assi indicata. Esso può essere

  • x1y1: Asse delle ascisse inferiore e asse delle ordinate sinistro (scelta di default)
  • x2y1: Asse delle ascisse superiore e asse delle ordinate sinistro
  • x1y2: Asse delle ascisse inferiore e asse delle ordinate destro
  • x2y2: Asse delle ascisse superiore e asse delle ordinate inferiore

Questa funzionalità è molto utile nel caso si vogliano raffigurare più funzioni su un unico grafo che hanno però range differenti.
Per esempio, supponiamo di voler rappresentare in uno stesso grafo la parabola usata sin'ora e la funzione coseno.
La parabola assume valori maggiori di -4.25, mentre il coseno varia nell'intervallo [-1;+1].


Parabola e coseno

Decidiamo quindi di utilizzare due asse delle ordinate differenti per visualizzare diversi intervalli del codominio.

gnuplot> set ytics nomirror
gnuplot> set y2tics nomirror

Questi comanti servono per ottenere sul grafo finale due assi delle ordinate distinti. In particolare con nomirror stiamo indicando che su un asse non dovranno comparire le "stanghette" dell'altro e viceversa.
Per ulteriori dettagli si veda l'uso del comando set.

Infine otteniamo il grafo delle due funzioni col comando:

gnuplot> plot [-5:5][-6:] (x**2)+(3*x)-2 axes x1y1, cos(pi*x) axes x1y2

Titolo

Ogni grafo incontrato sin'ora ha presentato una piccola legenda in alto a destra dove venivano riportate le funzioni disegnate.
Il comportamento di default riporta nella legenda il nome della funzione, o l'equazione passati al comando plot.
E' possibile tuttavia utilizzare dei nomi differenti esplicitandoli in fase di disegno.

Analizziamo la forma che può assumere <title-mod> introdotta all'inizio:

title <title>
notitle

Ipotizziamo che nel disegno precedente avessimo preferito che comparissero nella legenda le scritte "parabola" e "coseno" anziché le corrispondenti equazioni.
In questo caso il comando da digitare sarebbe stato:

gnuplot> set ytics nomirror
gnuplot> set y2tics nomirror
gnuplot> plot [-5:5][-6:] (x**2)+(3*x)-2 axes x1y1 title "Parabola", cos(pi*x) axes x1y2 title "Coseno"

Se invece non avessimo voluto nulla nella didascalia avremmo dovuto digitare come ultimo comando

gnuplot> plot [-5:5][-6:] (x**2)+(3*x)-2 axes x1y1 notitle, cos(pi*x) axes x1y2 notitle

o in alternativa

gnuplot> plot [-5:5][-6:] (x**2)+(3*x)-2 axes x1y1 title "", cos(pi*x) axes x1y2 title ""

Lasciando vuoto il contenuto delle virgolette.

!!! Attenzione: contenuto vuoto vuol dire senza spazi

Se infatti avessimo digitato

gnuplot> plot [-5:5][-6:] (x**2)+(3*x)-2 axes x1y1 title " ", cos(pi*x) axes x1y2 title " "

Sarebbe comparso il solo tratto della funzione d'esempio senza il titolo (in realtà il titolo è un invisibile spazio bianco)

Ovviamente è possibile precisare poilitiche di stili diversi per le diverse funzioni.

Di seguito riportiamo i tre grafi degli esempi descritti.

Ulteriori aspetti della legenda, come posizione e dimensione sono configurabili tramite l'uso del comando set key per un cui uso si rimanda alla sezione set.

With

Con with si precisa lo stile con la funzione verrà precisata.

Esistono svariati stili che permettono di rappresentare il grafico in altrettante modalità: con funzioni a scalini, con singoli punti, con il riempimento delle aree a impulsi e molto altro ancora.

Una trattazione completa porterebbe via parecchio tempo e pertanto è stata dedicata una Sezzione apposita a cui si rimanda per ogni dettaglio.

Datafile


Distribuzione esponenziale

Quello che inizialmente è stato definito come <input> può non essere necessariamente una funzione. E' possibile che sia anche un file, in formato testo, contenente dei dati da raffigurare.

Se si dispone quindi di un file di testo, in cui i dati sono definite su due colonne separate da uno spazio o da un tab sarà possibile dire al programma di disegnare i punti definiti prendendo la prima colonna come ascissa e la seconda come ordinata.
Riprendiamo quindi l'esempio iniziale di un grafo per punti di una funzione esponenziale ottenuta col comando:

gnuplot> plot "exponential.dat"

e vediamo come possiamo modifcare l'output generato.


Distribuzione esponenziale invertita

Per prima cosa precisiamo delle colonne diverse: siamo interessati a plottare la seconda colonna come ascisse e la seconda come ordinate.
La sintassi da utilizzare è la seguente

gnuplot> plot <datafile> using <numero_prima_colonna>:<numero_seconda_colonna>...

Digitando quindi

gnuplot> plot "exponential.dat" using 2:1

otterremmo il grafico inverso, ossia un campionamento presa da una funzione logaritmica.

Sono necessarie alcune precisazioni.
In primo luogo è possibile utilizzare un file di testo su più colonne, non solo su due, estrapolando le informazioni di interesse da un documento più complesso di quello richiesto dal nostro scopo.

Si noti inoltre che nella definizione della sintassi dopo gli indici delle colonne sono stati inseriti dei punti di sospensione, questo perché a seconda dello stile che si sta utilizando potrebbe essere necassario disporre di più dati.

Supponiamo ora di non voler rappresentare tutti i bunti definiti nel file. A questo scopo dobbiamo utilizzare il comando every

gnuplot plot <datafile> every <punto_inc>:<blocco_inc>:<punto_start>:<blocco_start>:<punto_end>:<blocco_end>

Per nulla intuitivo.

Spieghiamo un attimo la sintasssi, descrivendo per prima cosa il concetto di "blocco".

In un file di testo i set di dati possono essere separati da linee vuote: in questo caso si parla di blocchi di dati. L'utilità dei blocchi è quella di poter raggruppare in un unico file più distribuzioni, derivanti da esperimenti differenti o da prove reiterate.

Il comando every compie due cicli: il primo all'interno dei blocchi, partendo da quello coni ndice <blocco_start> e terminando con quello di indice <blocco_end> con uno step di <blocco_inc>.

Per ogni blocco selezionato compie un ulteriore selezione basata sui singoli punti, incominciando dal punto con indice <punto_start>, arrivando fino a <punto_end> con uno step di <punto_inc>.

Abbianmo le idee più chiare? Bene allora vediamo qualche esempio

gnuplot> plot "exponential.dat" every 3

Disegniamo un punto ogni 3

gnuplot> plot "exponential.dat" every ::10

Saltiamo i primi dieci punti

gnuplot plot "exponential.dat every 2::10::30

Disegniamo i punti dal decimo al ventesimo uno si e uno no

Come si nota gli argomenti sono via via opzionali.

I risultati dei comandi digitati sono riportati di seguito