2012-11-21 16 views
10

In alcuni casi, matplotlib mostra il grafico con errori erronei quando si utilizza la scala logaritmica. Supponiamo questi dati (entro pylab per esempio):Errori erratici quando si utilizza yscale ('log') su matplotlib

s=[19.0, 20.0, 21.0, 22.0, 24.0] 
v=[36.5, 66.814250000000001, 130.17750000000001, 498.57466666666664, 19.41] 
verr=[0.28999999999999998, 80.075044597909169, 71.322124839818571, 650.11015891565125, 0.02] 
errorbar(s,v,yerr=verr) 

e ottenere un risultato normale ma quando passo scala logaritmica:

yscale('log') 

ottengo una trama in cui alcuni errorbars non sono visibili , anche se è ancora possibile vedere alcuni dei limiti della barra di errore. (Vedi sotto). Perché sta succedendo questo, e come posso risolverlo?

log plot example

risposta

10

Il problema è che per alcuni punti v-verr sta diventando negativo, valori < = 0 non può essere visualizzata su un asse logaritmico (log(x), x<=0 è indefinito) Per aggirare il problema è possibile utilizzare gli errori asimmetrici e la forza i valori risultanti devono essere sopra lo zero per i punti offensivi.

In qualsiasi punto per cui gli errori siano superiori al valore verr>=v assegniamo verr=.999v in questo caso la barra di errore si avvicina a zero.

Ecco lo script

import matplotlib.pyplot as plt 
import numpy as np 

s=[19.0, 20.0, 21.0, 22.0, 24.0] 
v=np.array([36.5, 66.814250000000001, 130.17750000000001, 498.57466666666664, 19.41]) 
verr=np.array([0.28999999999999998, 80.075044597909169, 71.322124839818571,  650.11015891565125, 0.02]) 
verr2 = np.array(verr) 
verr2[verr>=v] = v[verr>=v]*.999999 
plt.errorbar(s,v,yerr=[verr2,verr]) 
plt.ylim(1E1,1E4) 
plt.yscale('log') 
plt.show() 

Ecco il risultato

Logarithmic plot with error bars

17

Passa alla scala logaritmica, ma con questo comando:

plt.yscale('log', nonposy='clip') 

Analogamente, per l'x -ass .:

In ogni caso, se si dispone di un dev version of matplotlib nell'ultimo semestre, si avrà questo comportamento di ritaglio per impostazione predefinita, come discusso in Make nonposy='clip' default for log scale y-axes.

+3

Questa è davvero la risposta giusta. Molto più semplice della soluzione di Dan. –

Problemi correlati