Esempi per modificare gli assi lin/log
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(10,20,10)
y = x**4
Figura divisa in 4 con le tutte le combo (lin-lin, lin-log, log-lin, log-log)
plt.figure(figsize=(10,8))
plt.subplot(221)
plt.plot(x,y,'--or')
plt.xscale('linear')
plt.yscale('linear')
plt.subplot(222)
plt.plot(x,y,'--or')
plt.xscale('linear')
plt.yscale('log')
plt.subplot(223)
plt.plot(x,y,'--or')
plt.xscale('log')
plt.yscale('linear')
plt.subplot(224)
plt.plot(x,y,'--or')
plt.xscale('log')
plt.yscale('log')
plt.show()
Assi con range a piacere
Approfondimento: axis
rangeapiacere = [-100, 100, -2e5, 2e5]
plt.axis(rangeapiacere)
plt.plot(x,y,'or')
plt.show()
Chi quadro risultante da un fit
Esempio fit di punti con polyfit (approfondiamento: numpy.polyfit)
Se polyfit viene usato con l'opzione full=True restituisce non solo i parametri ma anche i residui (somma degli scarti quadratici), il chi quadro ridotto è quindi ottenibile dividento questo numero per il numero di gradi di libertà (nr dati - parametri fit)
x = np.linspace(0,20,50)
y = x**2 + np.random.normal(0,5,50) # parabola con spread gaussiano
plt.plot(x,y,'ob', label='dati',alpha=0.5)
# fit quadratico (nelle variabili "_" intercetto quantità che non mi interssa usare)
p, residuals, _, _, _ = np.polyfit(x, y, 2, full=True)
red_chisq = residuals/(y.size-3) # chi quadro ridotto
# plot del risultato del fit (usando polyval)
plt.plot(x,np.polyval(p,x),'--r',label='$\chi^2/dof = %.2f$'%red_chisq, linewidth=2)
plt.legend(fontsize=16)
plt.show()
Esempio con scipy.optimize.curve_fit (approfondiamento: curve_fit)
Il comando curve_fit non restituisce direttamente il chi quadro che va quindi ricavato (somma degli scarti quadratici del modello rispetto ai dati)
import scipy.optimize as opt
# funzione lineare (retta)
def quadr(x, *pars):
return pars[0]*x**2 + pars[1]*x + pars[0]
plt.plot(x,y,'ob', label='dati',alpha=0.5)
optPars, pCov = opt.curve_fit(quadr,x,y,p0=[1,0.1,1]) # optPar contiene i parametri risultanti dal fit mentr pCov è la matrice di covarianza
# calcolo chi quadro (si può fare in una linea ma così sono chiari i passaggi)
least_squares = (quadr(x,*optPars) - y)**2 # scarti quadratici
chisq = least_squares.sum() # somma totale
red_chisq = chisq / (y.size - 3) # chi quadro ridotto (divisione per nr di dati meno i parametri liberi)
plt.plot(x,quadr(x,*optPars),'--r',linewidth=2, label='$\chi^2/dof = %.2f$'%red_chisq)
plt.legend(fontsize=16)
plt.show()