Faltan barras de errores cuando se usa yscale (‘log’) en matplotlib

En algunos casos, matplotlib muestra el gráfico con barras de error de forma errónea cuando se utiliza la escala logarítmica. Supongamos estos datos (dentro de pylab, por ejemplo):

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) 

y obtengo un resultado normal, pero cuando cambio a la escala logarítmica:

 yscale('log') 

Obtengo un gráfico en el que algunas barras de error no son visibles, aunque todavía puedes ver algunos de los topes de la barra de error. (Vea a continuación). ¿Por qué sucede esto y cómo puedo solucionarlo?

ejemplo de diagrama de registro

El problema es que para algunos puntos, v-verr está volviendo negativo, los valores <= 0 no se pueden mostrar en un eje logarítmico ( log(x) , x<=0 no está definido) Para evitar esto, puede usar errores asimétricos y forzar la los valores resultantes deben estar por encima de cero para los puntos ofensivos.

En cualquier punto en el que los errores sean mayores que el valor verr>=v , asignamos verr=.999v en este caso, la barra de error se verr=.999v a cero.

Aquí está el guión

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

Aquí está el resultado.

Gráfica logarítmica con barras de error.

Cambie a la escala logarítmica, pero con este comando:

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

Análogamente, para el eje x:

 plt.xscale('log', nonposx='clip') 

De todos modos, si tiene una versión de desarrollo de matplotlib en el último medio año, tendrá este comportamiento de recorte de forma predeterminada, tal como se describe en Predeterminado = ‘clip’ predeterminado para la escala de registros de los ejes y .