Matplotlib

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.

matplotlib.pyplot

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()
figA1.png

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()
figA2.png

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()
figA3.png

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
figA4.png

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()
figA5.png

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()
figA6.png

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()
figA7.png

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]')
figAB.png

Per ulteriori esempi e dettagli sui grafici ai rimanda al sito: matplotlib.org