2012-02-28 115 views
14

Estoy intentando rellenar el área bajo una curva con matplotlib. El script a continuación funciona bien.Rellene el área debajo de la curva en matlibplot python en la escala de log

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() 

Sin embargo, si ajusto la escala y a logarítmica (consulte a continuación). ¡A veces llena el área sobre la curva! ¿Alguien puede ayudarme? Me gustaría llenar el área entre la curva y 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() 

¡Gracias de antemano!

Respuesta

13

Con una escala y logarítmica, fill_between(x, y, 0) indica a matplotlib que llene la región entre log(0) = -infinity y log(y). Naturalmente, se resiste. Puede evitar el problema cambiando 0 a un número pequeño como 1e-6.

+0

¡Por supuesto! 1e-6 puede ser demasiado pequeño, pero plt.fill_between (x, y, 1, color = '0.8') funciona bien! –

2

Como se mencionó, 0 -> -inf en una escala de registro. Por lo tanto, cualquier valor trazado que sea menor o igual a cero sería problemático (requiriendo un ylim infinito en el espacio de registro). Este problema existe independientemente de si está utilizando fill_between() o no.

Afortunadamente, matplotlib proporciona una manera de manejar esto muy bien. En el comportamiento predeterminado, matplotlib enmascara los valores de cada valor menor o igual a cero. En su ejemplo, esto significa que toda su línea y=0 está enmascarada y excluida del polígono que define el área ocupada. El resultado es que el polígono simplemente se cierra dibujando una línea desde (100,10) hacia abajo y hacia la izquierda hasta (0,0). Otra opción es recortar los valores. En este caso, se establecen en 1e-300 y no se consultan al determinar el ylim de la gráfica. Para obtener el resultado deseado, haga lo siguiente:

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