Si tratta di tool grafici per Python, il sito di riferimento e': matplotlib.org ove si trova la documentazione e moltissimi esempi.
Matplotlib usa Numpy, nel senso che grafica vettori di NumPy od oggetti (come liste) che possono essere convertiti in vettori di Numpy.
Per usare matplotlib occerre importare il pacchetto omonimo ed importare anche la sua componente pyplot, che fornisce comandi sintetici per i grafici:
import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np
Oggetti di base in matplotlib sono:
Figure | L'intero spazio su cui si fa il grafico |
Axes | Identifica una regione, nella Figure ove fare il grafico. E' il principale oggetto per gestire la grafica. I comandi per la grafica sono attributi di questo oggetto, come anche il titolo del grafico e le labels degli assi. |
Axis | Sono i singoli assi del grafico, con i tick mark, e le scritte relative |
Artist | Un termine che indica tutte le componenti software che eseguono parti del disegno |
All'inizio occorre creare una "Figure"; non e' necessario farlo in modo esplicito; routines di pyplot, come subplots , o anche altri comandi per fare grafici, lo fanno automaticamente, subplots crea anche oggetti Axes associati alla Figure ed, eventualmente divide l'area della Figure in diversi rettangoli in cui fare grafici, ogni rettangolo con i suoi oggetti Axes.
fig = plt.figure() # Una figura vuota fig,ax = plt.subplots() # Una figura con un oggetto Axes fig,axs= plt.subplots(2,2)# Una figura divisa in 2 parti, con i loro Axes
Il creatore della Figure ha una serie di parametri di tipo keyword, opzionali, alcuni sono illustrati nella tabella seguente.
figsize=(width, height) | Dimensioni della figura, in pollici |
dpi=100.0 | Risoluzione, in punti per pollice |
facecolor='white' | Colore dello sfondo |
edgecolor='white' | Colore del bordo |
linewidth=1.0 | Spessore della linea al bordo (pixels) |
La Figure ha molte funzioni per gestire il grafico, ne elenchiamo alcune, anche se in genere, per operare sul grafico, si utilizzano le funzioni simili della componente marplotlib.pyplot (nella tabella "fig" e' un'istansa di Figure).
fig.add_axes() | Aggiunge oggetto Axes (assi del plot) |
fig.figimage () | Aggiunge un'immagine |
fig.get_axes() | Ottiene una lista degli axes |
fig.legend() | mette una leggenda nella figura |
fig.savefig(nomefile) | Mette la figura in un file |
fig.text(x,y,testo) | Aggiunge un testo in posizione x,y |
L'oggetto Axes definisce il sistema di coordinate per il plot , il disegno dei singoli assi (oggetto Axis), testo, linee della figura etc. I principali comandi per i grafici sono funzioni dell'oggetto Axes, nella tabella seguente alcuni di essi, con "ax" e' indicata un'istanza di Axes (non sono elencati tutti gli argomenti).
ax.plot(x,y,formato) | Un grafico degli array in argomento Il formato e' una stringa che dice come disegnare i punti: colore e forma |
ax.scatter(x,y) | Per scatter plots, ha anche argomenti per il formato ed i colori dei punti |
ax.bar(x,h,width=0.8) | Per plot a torri |
ax.barh(x,h,width=0.8) | Per plot a torri in orizzontale |
ax.pie(x) | Grafici a torta |
ax.hist(x) | Istogrammi |
ax.contour(x,y,z) | Grafici a livelli |
Abbiamo anche molte funzioni di Axes per definire l'aspetto del grafico, alcune sono elencate nella tabella seguente.
ax.text(x,y,stringa) | Mette un testo in posizione x,y |
ax.arrow(x,y,dx,dy) | Mette una freccia |
ax.set_xscale('log') ax.set_yscale('log') | Per assi logaritmici |
ax.set_title('titolo') | Il titolo del frafico |
ax.set_yticks([..]) ax.set_xticks([..]) | Posizioni dei segni sugli assi |
ax.set_xlabel('string') ax.set_ylabel('string') | Nomi degli assi |
I formati per il comando plot sono stringhe di 3 o 4 caratteri, il primo indica il colore, il secondo come sono disegnati i punti, il terzo le linee. Il default e': "b-" una linea blu.
Per i colori abbiamo: "b" per blu, "g" per verde, "r" rosso, "c" ciano, "m" magenta, "y" giallo, "k": nero, "w": bianco.
Per i punti abbiamo".": punto, "o": cerchi, "< > ^ v" per triangoli nelle diverse direzioni, "8" per ottagoni. "s": quadrati, 'p': segno piu', "*" : stelline, "x X" : croci ; "1 2 3 4 ": per segni a v.
Per le linee: "-" : linea , "__" : trattini. "-." tratini e punti , ":" puntini.
L'uso di matplotlib e' molto semplificato dal sub-package pyplot. Questo modulo contiene funzioni che creano in automatico la Figure ed hanno valori di default per gli Axes, per cui tutto e' molto piu' semplice.
Nella tabella che segue vediamo alune funzioni di pyplot. plt sta per matplotlib.pyplot, qui si assume che abbiamo importato pyplot con: "import matplotlib.pyplot as plt".
plt.plot(x,y,'formato') plt.scatter(x,y) plt.bar(x,h) plt.pie(x) plt.hist(x) plt.contour(x,y,z) |
Fanno diversi tipi di grafici analoghe alle funzioni omonime dell'oggetto Axes |
plt.xscale('log') plt.yscale('linear') |
Scale logaritmiche o lineare (default: 'linear') |
plt.xlabel('stringa) plt.ylabel('stringa) |
Per nomi degli assi |
plt.xticks([x val],('labels')) plt.yticks([y val],('labels')) |
valori e segni sugli assi, in argomento una lista di posizioni ed una lista, o tupla di stringhe |
plt.axis([xmin,xmax,ymin,ymax]) | Estensione degli assi |
plt.suptitle('stringa') | Titolo generale della Figure per figure con piu' grafici |
plt.title('stringa') | Titolo per un singolo grafico |
fig=plt.figure() ax1=plt.subplot(2,1,1) ax2=plt.subplot(2,1,2) |
Si puo' ottenere una figura, dividerla in parti e definire oggetti Axes per ogni parte |
plt.clf() | Svuota la Figure |
plt.cla() | Resetta Axes |
plt.text(x,y,'testo') | Mette un testo |
plt.grid(True) | Mostra un reticolo sulla figura |
Le funzioni di matplotlib hanno molti parametri, in genere i default sono sufficienti, ma e' anche possibile definire minimi dettagli del grafico.
Vediamo ora alcuni esempi di grafici semplici.
Nell'esempio seguente matplotlib usa dei valori di default per fare tutto lui, figura, assi ,thick mark etc. La funzione show() mostra il grafico in una sua finestra, ma poi lo resetta, per cui il salvataggio su file (funzione savefig) va fatto prima:
import matplotlib.pyplot as plt plt.plot([1,2,3],[10,20,30]) plt.savefig('figA1.png') plt.show()
In questo secondo esempio abbiamo uno "scatter plot" grafichiamo insieme due funzioni, specificando un colore e simbolo per ognuna, di diamo un titolo, nomi e dimensioni agli agli assi, mettiamo un testo:
import matplotlib.pyplot as plt x=[1,2,3,4] y=[2,4,6,8] z=[1,4,9,16] plt.plot(x, y, 'ro',x,z,'bs') plt.axis([0,6,0,20]) plt.title('Semplice plot') plt.xlabel('asse x') plt.ylabel('asse y') plt.text(4,18,'una parabola') plt.text(4,9,'una retta') plt.savefig('figA2.png') plt.show()
Nell'esempio seguente facciamo un istogramma Il secondo argomento della funzione hist dice in quanti gruppi raggruppare i valori di x la funzione restituisce 3 oggetti:
- n: una lista con l'istogramma
- bins: i 6 valori che delimitano l'istogramma
- (ha diviso l'intervallo 1:5 grande 4, in 5 parti)
- patches: lista dei rettangoli dell'istogramma
import matplotlib.pyplot as plt x = [1,2,2,2,2,3,3,3,4,4,4,4,4,4,5,5,5,5,5] n,bins,patches = plt.hist(x,5) plt.xlabel('valore') plt.ylabel('frequenza') plt.title('Istogramma') plt.axis([0,5,0,10]) plt.grid(True) # mette un reticolo plt.show()
Vediamo ora un grafico a torta. patches: sono i disegni delle fette, testo: una lista con le labels:
import matplotlib.pyplot as plt x = [10,50,20,20] patches,testi=plt.pie(x,colors=('b','g','y','r'), labels=('blu','verde','giallo','rosso')) plt.title('Torta') plt.show() In questo esempio abbiamo un grafico a torta. patches: sono i disegni delle fette, testo: una lista con le labels
Qui abbiamo un "bar plot", diamo esplicitamente valori ai "tick marks" dell'asse x:
import matplotlib.pyplot as plt x=[1,2,3,4] h=[1,3,5,2] plt.xticks(x,('uno','due','tre','quattro')) plt.bar(x,h) plt.show()
Ancora un "bar plot, ma con barre orizzontali:
import matplotlib.pyplot as plt x=[1,2,3,4] h=[1,3,5,2] plt.xticks(x,('uno','due','tre','quattro')) plt.barh(x,h) plt.show()
Bar plot orizzontale, con barre di diverso colore:: e label sull'asse y:
import matplotlib.pyplot as plt x=[1,2,3,4] h=[1,3,5,2] plt.yticks([1,2,3,4],('red','green','blue','yellow')) plt.barh(x,h,color=['r','g','b','y']) plt.show()
Vediamo ora un esempio piu' complicato (preso dal tutorial di matplotlib, ma modificto)
import matplotlib.pyplot as plt import numpy as np # qui usiamo numpy e definiamo x ed y di una funzione x = np.arange(0.0, 5.0, 0.01) y = np.cos(2 * np.pi * x) # Qui dividiamo la figura in 2 parti: individuate # da un reticolo di 1 linea e 2 colonne # ( i primi 2 argomenti di subplot), # facciamo una figura allungata,con il parametro figsize fig,ax= plt.subplots(1, 2,figsize=(7, 2.7)) # Siccome abbiamo 2 grafici, la funzione subplot ci # restituisce un array di due oggetti Axes, ax1=ax[0] # axes del primo grafico ax2=ax[1] # axes del secondo grafico # faccio un primo grafico, plot mi torna una lista # di oggetti che rappresentano le linee da disegnare l1= ax1.plot(x,y,'r1') ax1b = ax1.twinx() # mi creo un Axes ausiliario a destra # un secondo grafico, con una altra scala, associato all'asse a destra l2 = ax1b.plot(x,range(len(x)), 'C1') # metto una legenda, associata alle linee. ax1b.legend([l1[0], l2[0]], ['Sine (left)', 'Straight (right)']) # ora il secondo grafico, nel secondo riquadro della figura ax2.plot(x,y,'bo') ax2.set_xlabel('Angle [rad]') # label per asse x # Ora faccio un asse secondario in alto, i cui valori sono # ottenuti dai valori del primo asse con una funzione che # definisco, assieme all'inversa. ax2b = ax2.secondary_xaxis('top', functions=(np.rad2deg, np.deg2rad)) ax2b.set_xlabel('Angle [gradi]')
Per ulteriori esempi e dettagli sui grafici ai rimanda al sito: matplotlib.org