2012-11-21 6 views
10

W niektórych przypadkach matplotlib pokazuje wykres z błędnymi paskami błędów podczas używania skali logarytmicznej. Załóżmy, że te dane (w ciągu pylab na przykład):Brakujące paski błędów podczas używania yscale ('log') at 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) 

i uzyskać prawidłowy wynik, ale po przełączeniu na skali logarytmicznej:

yscale('log') 

uzyskać wykres, w którym niektóre errorbars nie są widoczne , chociaż nadal widać niektóre z limitów pręta błędu. (Patrz poniżej.) Dlaczego tak się dzieje i jak mogę to naprawić?

log plot example

Odpowiedz

10

Problemem jest to, że dla niektórych punktów v-verr jest coraz ujemna, wartości < = 0 nie mogą być pokazane w skali logarytmicznej osi (log(x), x<=0 jest niezdefiniowany) Aby obejść ten problem można użyć asymetryczne błędów i siły wynikowe wartości powyżej zera dla punktów obrażających.

W dowolnym momencie, dla którego błędy są większe niż wartość verr>=v, przypisujemy verr=.999v w tym przypadku pasek błędu zbliża się do zera.

Oto skrypt

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

Oto wynik

Logarithmic plot with error bars

17

Przełącz na skali logarytmicznej, ale z tym poleceniem:

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

Analogicznie dla X -axis:

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

W każdym razie, jeśli masz dev version of matplotlib w ciągu ostatniego pół roku, to miałoby to zachowanie obcinania domyślnie, jak to omówiono w Make nonposy='clip' default for log scale y-axes.

+3

To naprawdę jest właściwa odpowiedź. Znacznie prostsze niż rozwiązanie Dana. –

Powiązane problemy