Grafici con matplotlib 2

Guida completa: matplotlib.pyplot.plot

uso del modulo numpy

Full docs (numpy è parte della suite scipy) numpy Per chi viene da matlab: numpy for matlab users

Caricare i moduli definendo una breve stringa di caratteri per richiamarli in tutto il programma. Tipicamente si usa np e plt

In [1]:
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np

numpy è comodo perché permette l'immediata lettura di dati salvati in un file di testo (txt, csv, xml, json...) Ad esempio usiamo un file dati.txt che contiene 1000 righe, 3 colonne:

  1. numero intero crescente nella prima
  2. numeri casuali uniformi fra 0 e 1 nella prima seconda
  3. numeri casuali gaussiani con media 10 e sigma 1 nella terza
  4. numeri casuali gaussiani con media 20 e sigma 2 nella quarta
...
0 37.345762335799044 10.814401918949596 21.528309346739572
1 34.009163092868654 10.241431907380798 21.796692783309577
2 34.571711986088836 9.01934152076184 19.011643862413628
3 38.968212062235196 10.629117455512583 21.383705396142606
4 35.72296385364186 9.143071326735619 18.57193741856059
...

(generato con genera_dati_a_caso)

In [2]:
a, b, c, d  = np.loadtxt('./files/dati.txt', unpack=True) # unpack perché loadtxt in output restituisce il dato diviso per righe
In [3]:
plt.plot(a,b, label='flat random')
plt.plot(a,c, label='gaus1')
plt.plot(a,d, label='gaus2')
plt.legend() # <--- note the default location "best"
plt.show()

Istogrammi

In [4]:
plt.hist(b)
plt.title('flat random')
plt.show()
In [5]:
plt.hist(c)
plt.title('gaus')
plt.show()
Cambiare binning e 2 histo
In [6]:
plt.hist(c, 100)
plt.hist(d, 100)

plt.title('gaus')
plt.show()

Colori

In [7]:
plt.hist(c, 100, color='r')
plt.hist(d, 100, color='y', ec='r')

plt.title('gaus')
plt.show()

Solo bordi, utile per sovrapposizioni

In [8]:
plt.hist(c, 100, histtype='step')
plt.hist(d, 100, histtype='step')
plt.hist(d-8, 100, histtype='step')

plt.title('gaus')
plt.show()

Statistiche istogrammi accessibili dagli array di dati che li generano (e le funzioni del modulo numpy max, min, mean, std) Esempio:

In [9]:
media = a.mean()
stdev = a.std()
massimo = a.max()
minimo = a.min()
integrale = a.sum()
print('Serie di dati a:')
print('  max: ', massimo)
print('  min: ', minimo)
print('  integrale: ', integrale)
print('  media: ', media)
Serie di dati a:
  max:  9999.0
  min:  0.0
  integrale:  49995000.0
  media:  4999.5

Per tutti i valori (for loop su una lista, stampa formattata)

In [10]:
for x in [b,c,d]:
    print('Tot dati: %10d, media %.2f, deviazione standard %.2f' % (len(x), x.mean(), x.std()))
Tot dati:      10000, media 35.01, deviazione standard 2.87
Tot dati:      10000, media 9.99, deviazione standard 1.01
Tot dati:      10000, media 20.01, deviazione standard 2.02

Scrivere nel plot con plt.text()

In [11]:
plt.hist(c, 100, histtype='step')
plt.hist(d, 100, histtype='step')
plt.hist(d-8, 100, histtype='step')
plt.text(20,200,'Entries: %d\nMean: %.1f\nStdev: %.1f' % (len(c), c.mean(),c.std()))
Out[11]:
Text(20, 200, 'Entries: 10000\nMean: 10.0\nStdev: 1.0')

Un po' di cosmesi:

In [12]:
colori = ['red', 'blue', 'green']
histos = [c,d,d-8]
for i in range(3):
    plt.hist(histos[i], 100, histtype='step', color=colori[i], label='mean = %.1f'%histos[i].mean())
plt.legend()
plt.show()

Istogrammi bidimensionali

In [13]:
plt.hist2d(c,d,)
plt.show()

Binning, palette, ...

In [14]:
plt.hist2d(c,d,100) # same for x and y
plt.show()
In [15]:
plt.hist2d(c,d,[50,200]) # 50 for x, 200 for y
plt.colorbar()
plt.show()
In [16]:
import matplotlib.colors as colors
palettes=['viridis', 'plasma', 'Blues', 'Spectral', 'PuBu_r', 'summer', 'RdBu', 'RdYlBu']

plt.figure(figsize=(12,6))
for i in range(8):
    plt.subplot(241+i)
    plt.hist2d(c,d,100, cmap=palettes[i])

plt.show()