2012-11-21 10 views
10

In einigen Fällen zeigt matplotlib das Diagramm mit Fehlerbalken fehlerhaft an, wenn logarithmische Skalierung verwendet wird. diese Daten (in pylab zum Beispiel) Angenommen:Fehlende Fehlerbalken bei Verwendung von 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) 

und ich bekomme ein normales Ergebnis, aber wenn ich auf logarithmische Skala wechseln:

yscale('log') 

ich ein Grundstück zu bekommen, in dem einige Fehlerbalken nicht sichtbar sind , obwohl Sie immer noch einige der Fehlerbalkenkappen sehen können. (Siehe unten.) Warum passiert das und wie kann ich es beheben?

log plot example

Antwort

10

Das Problem ist, dass für einige Punkte v-verr negativ werdenden Werte < = 0 nicht auf einer logarithmischen Achse dargestellt werden (log(x), x<=0 nicht definiert ist) Um dies zu umgehen Sie asymmetrische Fehler und Kraft verwenden können die resultierenden Werte sind für die fehlerhaften Punkte über Null.

Zu jedem Punkt, für den Fehler größer als Wert verr>=v sind, weisen wir verr=.999v zu. In diesem Fall wird der Fehlerbalken nahe Null gehen. Hier

ist das Skript

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

Hier wird das Ergebnis

Logarithmic plot with error bars

17

Umschalten auf logarithmische Skala, aber mit diesem Befehl:

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

Analog für die x -Achse:

Wie auch immer, wenn Sie im letzten halben Jahr eine dev version of matplotlib haben, haben Sie dieses Clipping-Verhalten standardmäßig, wie in Make nonposy='clip' default for log scale y-axes diskutiert.

+3

Das ist wirklich die richtige Antwort. Viel einfacher als Dans Lösung. –

Verwandte Themen