2012-02-28 9 views
14

Sto cercando di riempire l'area sotto una curva con matplotlib. Lo script qui sotto funziona bene.Riempimento area sotto curva in matlibplot python su scala di registro

import matplotlib.pyplot as plt 
from math import sqrt 
x = range(100) 
y = [sqrt(i) for i in x] 
plt.plot(x,y,color='k',lw=2) 
plt.fill_between(x,y,0,color='0.8') 
plt.show() 

Tuttavia se si imposta la scala y su logaritmico (vedere di seguito). A volte riempie l'area sopra la curva! Qualcuno può aiutarmi? Vorrei riempire l'area tra la curva y = 0.

x = range(100) 
y = [sqrt(i) for i in x] 
plt.plot(x,y,color='k',lw=2) 
plt.fill_between(x,y,0,color='0.8') 
plt.yscale('log') 
plt.show() 

Grazie in anticipo!

risposta

13

Con un y-scala logaritmica, fill_between(x, y, 0) dice matplotlib ad occupare la regione tra log(0) = -infinity e log(y). Naturalmente, vacilla. È possibile evitare il problema modificando 0 in un numero piccolo come 1e-6.

+0

Naturalmente! 1e-6 può essere troppo piccolo, ma plt.fill_between (x, y, 1, color = '0.8') funziona bene! –

2

Come accennato, 0 -> -inf in una scala di registro. Pertanto, qualsiasi valore tracciato che fosse inferiore o uguale a zero sarebbe problematico (richiedendo uno ylim infinito nello spazio log). Questo problema esiste indipendentemente dal fatto che stai usando fill_between() o meno.

Fortunatamente, Matplotlib fornisce un modo per gestirlo bene. Nel comportamento predefinito, matplotlib maschera i valori di ogni valore inferiore o uguale a zero. Nel tuo esempio, questo significa che l'intera linea y=0 è mascherata ed esclusa dal poligono che definisce l'area piena. Il risultato è che il poligono viene semplicemente chiuso disegnando una linea da (100,10) in basso a sinistra a (0,0). Un'altra opzione è quella di ritagliare i valori. In questo caso, sono impostati su 1e-300 e non vengono consultati quando si determina lo ylim della trama. Quindi, per ottenere il risultato desiderato, fai quanto segue:

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