Questa è una sintetica ed elementare introduzione su come iniziare a tracciare dei grafici in Python. Consiglio vivamente di fare riferimento alla documentazione ufficiale Matplotlib. Scopo di questo documento è solo quello di far fare i primi passi a chi parte da zero, richiedendo soltanto un impegno di alcune ore.
Materiale necessario
Sul proprio computer devono essere installati i seguenti pacchetti: python, numpy, matplotlib. Per effettuare una verifica digitare su un terminale i seguenti comandi:
$ python >>> import numpy as np >>> import pylab as plAttenzione ai caratteri ">>>", non vanno digitati, perchè sono il prompt dell'ambiente python!
Se non vengono emessi messaggi di errore vuol dire che tutto è a posto. Altrimenti occorrerà procedere ad installare i pacchetti mancanti secondo le regole della propria distribuzione.
E' anche possibile conoscere le versioni installate con i seguenti comandi:
$ python >>> import numpy >>> numpy.__version__
che risponderà con qualcosa del genere:
'1.6.2'
e
$ python >>> import matplotlib >>> matplotlib.__version__
che risponderà con qualcosa tipo:
'1.1.1rc2'
Sono i grafici più comuni che mettono in relazione i valori x con i corrispondenti valori y unendo i punti con un segmento. Il codice di base per disegnare un grafico di questo tipo è riportato qui di seguito:
Mentre il risultato che si ottiene è riportato nella figura seguente:
Grafico segmentato |
In alternativa, se si vuole sottolineare solo la posizione dei singoli punti, ma senza collegarli con dei segmenti, si ottiene il tipo di grafico presentato qui di seguito. Potrebbe essere il caso in cui si voglia tracciare la posizione di stelle o galassie in un detereminato campo. Il codice di base per disegnare questo tipo di grafico è riportato qui di seguito:
Mentre il risultato che si ottiene è riportato nella figura seguente:
Grafico a punti |
Può risultare necessario tracciare diversi insiemi di dati in corrispondenza dello stesso asse e quindi bisogna essere in grado di distinguerli tra di loro utilizzando stili diversi per le linee e marcatori di diversi colori.
È possibile specificare il colore inserendo un terzo parametro nel comando plot(), per esempio, nel primo caso, modificando la riga
pl.plot(x, y)
in
pl.plot(x, y, 'r')
con la conseguenza di cambiare il colore da quello predefinito al rosso. Ma si possono usare facilmente altri colori, come riportato di seguito in grassetto:
blue, green, red, cyan, magenta, yellow, blak, white.
È inoltre possibile modificare lo stile della linea: punteggiato, tratteggiato, etc. Per esempio:
plot (x, y, '--')
dovrebbe produrre una linea tratteggiata.
Alcuni formati dei marcatori si realizzano tramite l'elenco seguente:
s quadrato, p pentagono, * asterisco, h esagono 1, H esagono 2, + crocetta, x x, D diamante grande, d diamante piccolo.
Per altri formati consultare la documentazione ufficiale Matplotlib.
È molto importante indicare sempre il nome degli assi del grafico per chiarire cosa si sta rappresentando. È possibile farlo utilizzando i comandi:
pl.xlabel('nome per l'asse x')
pl.ylabel('nome per l'asse y')
Per il titolo del grafico:
pl.title('titolo del grafico')
Per ridefinire gli intervalli predefiniti degli assi:
pl.xlim(xmin, xmax)
pl.ylim(ymin, ymax)
Di seguito un esempio di codice con relativo grafico:
Grafico con titoli |
È molto semplice disegnare più di un grafico sugli stessi assi, basta definire gli array x,y per ciascun grafico e quindi procedere:
plot(x1, y1, 'r') plot(x2, y3, 'g')
Di seguito un esempio di codice con relativo grafico:
Grafici sovrapposti |
È molto utile aggiungere una legenda nei grafici per poter distinguere le diverse funzioni o i tracciati. Nel realizzarla, proviamo anche a generare una funzione trigonometrica (sen(x), come segue:
Funzione trigonometrica con legenda |
Oppure vediamo il caso di due grafici nello stesso disegno:
Grafici sovrapposti con legenda |
Gli istogrammi sono molto utilizzati nelle applicazioni scientifiche ed è altamente probabile che prima o poi se ne abbia bisogno. Essi sono molto utili per tracciare le distribuzioni relative ai più svariati fenomeni: statistici, astronomici, molecolari,... In Matplotlib si utilizza il comando hist per fare un istogramma. Ecco un esempio di codifica con relativo grafico di uscita:
Istogramma segmentato |
Applichiamo alcune modifiche al codice precedente: eliminiamo le righe verticali e riduciamo la dimensione dei gradini:
Istogramma ad area |
Matplotlib è abbastanza flessibile per quel che riguarda la gestione di più finestre nello stesso grafico, ed è anche facile impostare questa funzione. Bisogna creare prima una figura e quindi specificare dei subplot al suo interno, come qui di seguito:
Finestre di grafici |
Una variante più articolata è quella qui di seguito codificata, con relativa figura di output:
Finestra di grafici (variante) |
Si possono anche regolare le dimensioni dei margini e le distanze interne tra le finestre con comandi del tipo:
pl.subplots_adjust(left=0.08, right=0.95, wspace=0.25, hspace=0.45)
L'uso dei file è molto importante sia per prelevare i dati da visualizzare sia per conservare dei dati che vengono generati dall'uso di funzioni. Esaminiamo, con qualche dettaglio, entrambe le situazioni.
Grafici con dati letti da file
Spesso i dati da visualizzare sono contenuti in un file in formato ascii (testo), ecco allora come gestire le operazioni fondamentali per aprire, leggere e scrivere un file.
In Python ci sono molti modi per leggere i dati da un file. Qui verrà usatos un metodo semplice, ma si dovrebbero leggere i manuali Python, NumPy e Matplotlib per conoscere altri metodi che, a volte, possono essere applicati meglio in situazioni particolari.
È possibile utilizzare NumPy per leggere i valori numerici da un file di testo. Si supponga, ad esempio, che il file datiprova.txt contenga i seguenti dati su 2 colonne di numeri:
# datiprova.txt
0 0
1 1
2 4
3 9
4 16
5 25
6 36
7 49
8 64
9 81
0 0
1 1
2 4
3 9
4 16
5 25
6 36
7 49
8 64
9 81
I dati del file possono essere letti, tramite la funzione np.loadtxt(), in un array bidimensionale e riportati in un grafico x,y come mostrato di seguito:
Grafico con dati letti da file |
Generazione di dati su file
Tra i vari modi esistenti per scrivere del testo su un file ecco un possibile modo per farlo, basato sulle classiche 3 fasi: apertura, scrittura, chiusura. Come esercizio verranno generati i dati per una semplice funzione parabolica.
L'esecuzione del programma provoca 3 effetti:
x = [ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9.] y = [ 0. 1. 4. 9. 16. 25. 36. 49. 64. 81.]
more datiscritti.txtsi otterrà in uscita:
0.0 0.0 1.0 1.0 2.0 4.0 3.0 9.0 4.0 16.0 5.0 25.0 6.0 36.0 7.0 49.0 8.0 64.0 9.0 81.0a conferma che il lavoro è stato eseguito correttamente.
Grafico con i dati generati |
In questo esempio, a scopo di esercizio, si vogliono tracciare delle funzioni più complesse utilizzando un mix delle tecniche apprese in precedenza ed aggiungendo qualche altro suggerimento riguardante il riempimento di aree (filling). I commenti riportati nel codice illustrano i punti più significativi.
Filling |
È anche possibile definire delle funzioni da invocare alterandone i parametri. L'esempio seguente mostra la realizzazione del codice per tracciare la classica funzione gaussiana:
dove σ è la deviazione standard e μ è la media dei valori.
Si noti la doppia chiamata alla funzione gaussian, la prima volta con i valori di μ (mu) e σ (sd) predefiniti, la seconda volta con i valori assegnati dall'utente. Attenzione, inoltre, che il secondo grafico viene visualizzato dopo la chiusura del primo.
Gaussiana (x, 0.0, 0.2) |
Gaussiana (x, 0.2, 0.3) |
Per la serie sviluppi futuri questo tutorial introduttivo si conclude con un esercizio la cui comprensione viene lasciata all'iniziativa del lettore. Buon lavoro.
Spatial |
Bis dat, qui dat celeriter.
(Dà due volte chi dà subito.)
Publilio Sirio