fill_between mit Transparenz#

Die Funktion fill_between erzeugt einen schattierten Bereich zwischen einer minimalen und maximalen Grenze, der zur Veranschaulichung von Bereichen nützlich ist. Sie verfügt über ein sehr praktisches Argument where, um das Füllen mit logischen Bereichen zu kombinieren, z. B. um eine Kurve nur über einem bestimmten Schwellenwert zu füllen.

Auf seiner grundlegendsten Ebene kann fill_between verwendet werden, um das visuelle Erscheinungsbild eines Graphen zu verbessern. Vergleichen wir zwei Graphen von Finanzdaten mit einem einfachen Liniendiagramm links und einer gefüllten Linie rechts.

import matplotlib.pyplot as plt
import numpy as np

import matplotlib.cbook as cbook

# load up some sample financial data
r = cbook.get_sample_data('goog.npz')['price_data']
# create two subplots with the shared x and y axes
fig, (ax1, ax2) = plt.subplots(1, 2, sharex=True, sharey=True)

pricemin = r["close"].min()

ax1.plot(r["date"], r["close"], lw=2)
ax2.fill_between(r["date"], pricemin, r["close"], alpha=0.7)

for ax in ax1, ax2:
    ax.grid(True)
    ax.label_outer()

ax1.set_ylabel('price')

fig.suptitle('Google (GOOG) daily closing price')
fig.autofmt_xdate()
Google (GOOG) daily closing price

Der Alpha-Kanal ist hier nicht unbedingt erforderlich, kann aber verwendet werden, um Farben für visuell ansprechendere Plots aufzuhellen. In anderen Beispielen, wie wir unten sehen werden, ist der Alpha-Kanal funktionell nützlich, da sich die schattierten Bereiche überlappen können und Alpha es Ihnen ermöglicht, beide zu sehen. Beachten Sie, dass das PostScript-Format Alpha nicht unterstützt (dies ist eine Einschränkung von PostScript, nicht von Matplotlib). Speichern Sie Ihre Abbildungen daher bei Verwendung von Alpha im PNG-, PDF- oder SVG-Format.

Unser nächstes Beispiel berechnet zwei Populationen von Zufallswanderern mit einem anderen Mittelwert und einer anderen Standardabweichung der Normalverteilungen, aus denen die Schritte gezogen werden. Wir verwenden gefüllte Bereiche, um +/- eine Standardabweichung der mittleren Position der Population darzustellen. Hier ist der Alpha-Kanal nützlich, nicht nur ästhetisch.

# Fixing random state for reproducibility
np.random.seed(19680801)

Nsteps, Nwalkers = 100, 250
t = np.arange(Nsteps)

# an (Nsteps x Nwalkers) array of random walk steps
S1 = 0.004 + 0.02*np.random.randn(Nsteps, Nwalkers)
S2 = 0.002 + 0.01*np.random.randn(Nsteps, Nwalkers)

# an (Nsteps x Nwalkers) array of random walker positions
X1 = S1.cumsum(axis=0)
X2 = S2.cumsum(axis=0)


# Nsteps length arrays empirical means and standard deviations of both
# populations over time
mu1 = X1.mean(axis=1)
sigma1 = X1.std(axis=1)
mu2 = X2.mean(axis=1)
sigma2 = X2.std(axis=1)

# plot it!
fig, ax = plt.subplots(1)
ax.plot(t, mu1, lw=2, label='mean population 1')
ax.plot(t, mu2, lw=2, label='mean population 2')
ax.fill_between(t, mu1+sigma1, mu1-sigma1, facecolor='C0', alpha=0.4)
ax.fill_between(t, mu2+sigma2, mu2-sigma2, facecolor='C1', alpha=0.4)
ax.set_title(r'random walkers empirical $\mu$ and $\pm \sigma$ interval')
ax.legend(loc='upper left')
ax.set_xlabel('num steps')
ax.set_ylabel('position')
ax.grid()
random walkers empirical $\mu$ and $\pm \sigma$ interval

Das Schlüsselwortargument where ist sehr praktisch, um bestimmte Bereiche des Graphen hervorzuheben. where nimmt eine boolesche Maske gleicher Länge wie die Argumente x, ymin und ymax und füllt nur den Bereich, in dem die boolesche Maske True ist. Im folgenden Beispiel simulieren wir einen einzelnen Zufallswanderer und berechnen den analytischen Mittelwert und die Standardabweichung der Populationspositionen. Der Populationsmittelwert wird als gestrichelte Linie dargestellt, und die Plus/Minus-Ein-Sigma-Abweichung vom Mittelwert wird als gefüllter Bereich dargestellt. Wir verwenden die where-Maske X > upper_bound, um den Bereich zu finden, in dem sich der Wanderer außerhalb der Ein-Sigma-Grenze befindet, und diesen Bereich rot zu schattieren.

# Fixing random state for reproducibility
np.random.seed(1)

Nsteps = 500
t = np.arange(Nsteps)

mu = 0.002
sigma = 0.01

# the steps and position
S = mu + sigma*np.random.randn(Nsteps)
X = S.cumsum()

# the 1 sigma upper and lower analytic population bounds
lower_bound = mu*t - sigma*np.sqrt(t)
upper_bound = mu*t + sigma*np.sqrt(t)

fig, ax = plt.subplots(1)
ax.plot(t, X, lw=2, label='walker position')
ax.plot(t, mu*t, lw=1, label='population mean', color='C0', ls='--')
ax.fill_between(t, lower_bound, upper_bound, facecolor='C0', alpha=0.4,
                label='1 sigma range')
ax.legend(loc='upper left')

# here we use the where argument to only fill the region where the
# walker is above the population 1 sigma boundary
ax.fill_between(t, upper_bound, X, where=X > upper_bound, fc='red', alpha=0.4)
ax.fill_between(t, lower_bound, X, where=X < lower_bound, fc='red', alpha=0.4)
ax.set_xlabel('num steps')
ax.set_ylabel('position')
ax.grid()
fill between alpha

Ein weiterer praktischer Anwendungsfall für gefüllte Bereiche ist die Hervorhebung von horizontalen oder vertikalen Bereichen eines Achsenobjekts – dafür hat Matplotlib die Hilfsfunktionen axhspan und axvspan. Siehe Bereiche zeichnen, die eine Achse überspannen.

Schlagwörter: Styling: Alpha Plot-Typ: fill_between Level: Intermediate Zweck: Showcase

Gesamtlaufzeit des Skripts: (0 Minuten 3,211 Sekunden)

Galerie generiert von Sphinx-Gallery