Zeichnen Sie yerr / xerr als schattierten Bereich und nicht als Fehlerbalken

Antworten:

150

Wenn Sie die reibungslose Interpolation zwischen Punkten in Ihrem Beispieldiagramm ignorieren (dies würde eine manuelle Interpolation erfordern oder nur eine höhere Auflösung Ihrer Daten haben), können Sie Folgendes verwenden pyplot.fill_between():

from matplotlib import pyplot as plt
import numpy as np

x = np.linspace(0, 30, 30)
y = np.sin(x/6*np.pi)
error = np.random.normal(0.1, 0.02, size=y.shape)
y += np.random.normal(0, 0.1, size=y.shape)

plt.plot(x, y, 'k-')
plt.fill_between(x, y-error, y+error)
plt.show()

Geben Sie hier die Bildbeschreibung ein

Siehe auch die matplotlib-Beispiele .

Gabriel
quelle
1
Perfekt. Ja, ich wollte kein Beispiel mit geglätteten Linien einfügen.
Austin Richardson
Irgendeine Idee, wie man diese Show schattierte Kästchen anstelle eines schattierten Bandes macht? Mein erster Instinkt war, zu missbrauchen, lwaber es scheint nicht die gleichen Einheiten wie die Achsen zu verwenden.
Benjamin Bannier
@BenjaminBannier Ich bin mir nicht ganz sicher, was du meinst. Es hört sich so an, als ob Sie an jedem Punkt ein Feld zeichnen möchten, dessen Höhe der des Fehlerbalkens entspricht, während die Breite so sein sollte, dass sie die benachbarten Felder verbinden (berühren). Ist das korrekt?
1
@EL_DON Du meinst, du möchtest eine Legende mit einer schwarzen Linie + einem blauen Band, und der Text wäre so etwas wie "Daten + 1 Sigma-Fehlerregion"?
1
@Allan Wenn die einzigen Fehlerbalken, die Sie haben, horizontal sind, sollten Sie wahrscheinlich die Achsen Ihres eigentlichen Problems (und damit auch die Abbildung) umdrehen. Normalerweise ist die unabhängige Variable diejenige ohne (oder mit sehr kleinen) Fehlerbalken. Möglicherweise können Sie betrügen, indem Sie Ihre Datenvariablen austauschen und in matplotlib auch die Achsen austauschen.
130

Dies ist im Grunde die gleiche Antwort von Evert , wurde jedoch erweitert, um einige coole Optionen von zu demonstrierenfill_between

Geben Sie hier die Bildbeschreibung ein

from matplotlib import pyplot as pl
import numpy as np

pl.clf()
pl.hold(1)

x = np.linspace(0, 30, 100)
y = np.sin(x) * 0.5
pl.plot(x, y, '-k')


x = np.linspace(0, 30, 30)
y = np.sin(x/6*np.pi)
error = np.random.normal(0.1, 0.02, size=y.shape) +.1
y += np.random.normal(0, 0.1, size=y.shape)

pl.plot(x, y, 'k', color='#CC4F1B')
pl.fill_between(x, y-error, y+error,
    alpha=0.5, edgecolor='#CC4F1B', facecolor='#FF9848')

y = np.cos(x/6*np.pi)    
error = np.random.rand(len(y)) * 0.5
y += np.random.normal(0, 0.1, size=y.shape)
pl.plot(x, y, 'k', color='#1B2ACC')
pl.fill_between(x, y-error, y+error,
    alpha=0.2, edgecolor='#1B2ACC', facecolor='#089FFF',
    linewidth=4, linestyle='dashdot', antialiased=True)



y = np.cos(x/6*np.pi)  + np.sin(x/3*np.pi)  
error = np.random.rand(len(y)) * 0.5
y += np.random.normal(0, 0.1, size=y.shape)
pl.plot(x, y, 'k', color='#3F7F4C')
pl.fill_between(x, y-error, y+error,
    alpha=1, edgecolor='#3F7F4C', facecolor='#7EFF99',
    linewidth=0)



pl.show()
Boris Gorelik
quelle
1
Etwas bessere Lösung: stackoverflow.com/questions/43064524/…
Shital Shah