2014-07-18 4 views
5

Ich suche nach einer Möglichkeit, schattierte Fehler-Regionen anstelle von Fehler-Balken in Python zu zeichnen.Schattierte Unsicherheit/Fehler Region in Matplotlib.pyplot

Ich weiß, dass es matplotlib.pyplot.fill_between() gibt, mit denen Sie eine Problemumgehung für den Y-Fehler erstellen können, aber die X-Unsicherheit nicht enthält.

problem_description

Irgendwelche Ideen? Leider hatte ich nicht genug Reputation um einen Kommentar abzugeben here.

Vielen Dank im Voraus!


bearbeiten

matplotlib.pyplot.fill_betweenx() führt zu so etwas wie:

fill_between_problem1


bearbeiten 2

Außerdem halte ich es für einen kompletten Unsicherheitsbereich für falsch. Im Folgenden werde ich zeichnen, was ich die richtige Form sein annehmen - ich hoffe, ich bin hier nicht falsch ...

problem_sketch

import numpy as np 
import matplotlib.pyplot as plt 

x = np.asarray([1.0, 2.0, 3.0, 4.0]) 
y = np.asarray([1.0, 2.3, 3.0, 4.0]) 
xerr = np.asarray([0.1, 0.7, 0.1, 0.1]) 
yerr = np.asarray([0.1, 0.9, 1.2, 0.1]) 

plt.errorbar(x, y, yerr, xerr) 

plt.fill_between(x, y-yerr, y+yerr, facecolor='#F0F8FF', alpha=1.0, edgecolor='none') 
plt.fill_betweenx(y,x-xerr, x+xerr, facecolor='#F0F8FF', alpha=1.0, edgecolor='#8F94CC', linewidth=1, linestyle='dashed') 

plt.show() 
# Red lines added with inkscape. 
+0

Ich dachte auch in diese Richtung. Aber denken Sie nicht, dass das eine eher konservative Schätzung ist? Ich werde versuchen, eine intelligente Methode zu finden, um eine Grenzkurve an eine Punktwolke anzupassen. Was ist deine Frist? – Schorsch

+0

Ich habe die Skizze ein wenig auf i) klarer sein und ii) um einige Fehler zu korrigieren. Ich glaube nicht, dass mein Beispiel konservativ ist. Stellen Sie sich völlig unkorrelierte Punkte mit Fehlerwerten vor (wo auch immer sie herkommen). Sie müssen daher quadratische Fehlerbereiche berücksichtigen. Wie verbreitet sich der Fehler zwischen zwei Punkten? Der einfachste Ansatz wäre die von mir skizzierte Annäherung erster Ordnung. Mach dir nicht zu viele Mühe! Python hat unglaublich viele Module, ich kann mir nicht vorstellen, dass es für so ein einfaches Problem nichts gibt. – smoneck

Antwort

5

habe ich dies mit der fill_betweenx Funktion zu arbeiten:

import numpy as np 
import matplotlib.pyplot as plt 

x = np.asarray([1.0, 2.0, 3.0, 4.0, 5.0]) 
y = np.asarray([1.0, 2.0, 3.0, 4.0, 5.0]) 
xerr = np.asarray([0.2, 0.4, 0.6, 0.8, 1.0]) 
yerr = np.asarray([0.1, 0.2, 0.3, 0.4, 0.5]) 

plt.errorbar(x, y, yerr, xerr) 

plt.fill_between(x, y-yerr, y+yerr,facecolor='r',alpha=0.5) 
plt.fill_betweenx(y,x-xerr,x+xerr,facecolor='b',alpha=0.5) 

plt.show() 

, die in dieser Handlung führt:

fill_between, fill_betweenx

EDIT

In Ihrem speziellen Beispiel kann es ausreichend sein, zu verwenden:

plt.fill_between(x, y-yerr, y+yerr,facecolor='#F0F8FF',alpha=1.0,edgecolor='none') 
plt.fill_betweenx(y,x-xerr, x+xerr,facecolor='#F0F8FF',alpha=1.0,edgecolor='none') 

Auf diese Weise, nicht wahr Kanten haben, die sich kreuzen würden und geben diese "fold" weg . Außerdem könnte es eine ausreichende Illusion eines Fehlerbandes erzeugen. Sie müssten jedoch sowohl die fill_between als auch die fill_betweenx verwenden.

+0

Vielen Dank für die Antwort! Aber ich sehe Schwierigkeiten, xerr und yerr auf einen Unsicherheitsbereich (gleiche Farbe) mit Rändern ('edgecolor') zu setzen. Dies würde immer noch zu Störungen führen. – smoneck

+0

Ein Bild in der Post hinzugefügt. Sie können die Schnittpunkte im oberen Teil sehen. – smoneck

+0

@smoneck Verstehe ich richtig: Sie suchen nach einem Umschlag, der alle Fehler in einem glatten Band enthält? Oder möchten Sie zum Beispiel in Ihrem Plot für einen Anstellwinkel = 0, dass die Band den 'y'-Fehler berührt? oder ist das Teil der Handlung, wie Sie es wollen? – Schorsch