Fläche zwischen zwei Linien füllen#

Dieses Beispiel zeigt, wie man fill_between verwendet, um die Fläche zwischen zwei Linien einzufärben.

import matplotlib.pyplot as plt
import numpy as np

Grundlegende Verwendung#

Die Parameter y1 und y2 können Skalare sein, was eine horizontale Grenze bei den gegebenen y-Werten anzeigt. Wenn nur y1 angegeben ist, wird y2 standardmäßig auf 0 gesetzt.

x = np.arange(0.0, 2, 0.01)
y1 = np.sin(2 * np.pi * x)
y2 = 0.8 * np.sin(4 * np.pi * x)

fig, (ax1, ax2, ax3) = plt.subplots(3, 1, sharex=True, figsize=(6, 6))

ax1.fill_between(x, y1)
ax1.set_title('fill between y1 and 0')

ax2.fill_between(x, y1, 1)
ax2.set_title('fill between y1 and 1')

ax3.fill_between(x, y1, y2)
ax3.set_title('fill between y1 and y2')
ax3.set_xlabel('x')
fig.tight_layout()
fill between y1 and 0, fill between y1 and 1, fill between y1 and y2

Beispiel: Konfidenzbänder#

Eine häufige Anwendung für fill_between ist die Angabe von Konfidenzbändern.

fill_between verwendet die Farben des Farbzyklus als Füllfarbe. Diese können beim Einfärben von Flächen etwas zu kräftig sein. Daher ist es oft eine gute Praxis, die Farbe aufzuhellen, indem die Fläche durch alpha halbdurchsichtig gemacht wird.

N = 21
x = np.linspace(0, 10, 11)
y = [3.9, 4.4, 10.8, 10.3, 11.2, 13.1, 14.1,  9.9, 13.9, 15.1, 12.5]

# fit a linear curve and estimate its y-values and their error.
a, b = np.polyfit(x, y, deg=1)
y_est = a * x + b
y_err = x.std() * np.sqrt(1/len(x) +
                          (x - x.mean())**2 / np.sum((x - x.mean())**2))

fig, ax = plt.subplots()
ax.plot(x, y_est, '-')
ax.fill_between(x, y_est - y_err, y_est + y_err, alpha=0.2)
ax.plot(x, y, 'o', color='tab:brown')
fill between demo

Selektives Füllen horizontaler Bereiche#

Der Parameter where ermöglicht die Angabe der auszufüllenden x-Bereiche. Es handelt sich um ein boolesches Array mit der gleichen Größe wie x.

Nur x-Bereiche von zusammenhängenden True-Sequenzen werden gefüllt. Infolgedessen wird der Bereich zwischen benachbarten True- und False-Werten nie gefüllt. Dies ist oft unerwünscht, wenn die Datenpunkte eine zusammenhängende Größe darstellen sollen. Es wird daher empfohlen, interpolate=True zu setzen, es sei denn, der x-Abstand der Datenpunkte ist fein genug, sodass der obige Effekt nicht bemerkbar ist. Interpolation approximiert die tatsächliche x-Position, an der sich die where-Bedingung ändert, und erweitert die Füllung bis dorthin.

x = np.array([0, 1, 2, 3])
y1 = np.array([0.8, 0.8, 0.2, 0.2])
y2 = np.array([0, 0, 1, 1])

fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True)

ax1.set_title('interpolation=False')
ax1.plot(x, y1, 'o--')
ax1.plot(x, y2, 'o--')
ax1.fill_between(x, y1, y2, where=(y1 > y2), color='C0', alpha=0.3)
ax1.fill_between(x, y1, y2, where=(y1 < y2), color='C1', alpha=0.3)

ax2.set_title('interpolation=True')
ax2.plot(x, y1, 'o--')
ax2.plot(x, y2, 'o--')
ax2.fill_between(x, y1, y2, where=(y1 > y2), color='C0', alpha=0.3,
                 interpolate=True)
ax2.fill_between(x, y1, y2, where=(y1 <= y2), color='C1', alpha=0.3,
                 interpolate=True)
fig.tight_layout()
interpolation=False, interpolation=True

Hinweis

Ähnliche Lücken treten auf, wenn y1 oder y2 Maskierungsarrays sind. Da fehlende Werte nicht approximiert werden können, hat interpolate in diesem Fall keine Auswirkung. Die Lücken um maskierte Werte können nur durch Hinzufügen weiterer Datenpunkte nahe den maskierten Werten reduziert werden.

Selektives Markieren horizontaler Bereiche über die gesamte Achse#

Derselbe Auswahlmechanismus kann angewendet werden, um die volle vertikale Höhe der Achse zu füllen. Um unabhängig von den y-Grenzwerten zu sein, fügen wir eine Transformation hinzu, die die x-Werte in Datenkoordinaten und die y-Werte in Achsenkoordinaten interpretiert.

Das folgende Beispiel markiert die Bereiche, in denen die y-Daten über einem bestimmten Schwellenwert liegen.

fig, ax = plt.subplots()
x = np.arange(0, 4 * np.pi, 0.01)
y = np.sin(x)
ax.plot(x, y, color='black')

threshold = 0.75
ax.axhline(threshold, color='green', lw=2, alpha=0.7)
ax.fill_between(x, 0, 1, where=y > threshold,
                color='green', alpha=0.5, transform=ax.get_xaxis_transform())
fill between demo

Referenzen

Die Verwendung der folgenden Funktionen, Methoden, Klassen und Module wird in diesem Beispiel gezeigt

Tags: styling: conditional plot-type: fill_between level: beginner purpose: showcase

Gesamte Laufzeit des Skripts: (0 Minuten 4,036 Sekunden)

Galerie generiert von Sphinx-Gallery