Hinweis
Gehen Sie zum Ende, um den vollständigen Beispielcode herunterzuladen.
Balkendiagramm mit Farbverläufen#
Matplotlib unterstützt Farbverläufe nicht nativ. Wir können jedoch ein Rechteck mit Farbverlauf simulieren, indem wir ein AxesImage der richtigen Größe und Farbe verwenden.
Insbesondere verwenden wir eine Colormap, um die tatsächlichen Farben zu erzeugen. Es reicht dann aus, die zugrunde liegenden Werte an den Ecken des Bildes zu definieren und die bikubische Interpolation den Bereich ausfüllen zu lassen. Wir definieren die Richtung des Farbverlaufs durch einen Einheitsvektor *v*. Die Werte an den Ecken werden dann durch die Längen der Projektionen der Eckvektoren auf *v* ermittelt.
Ein ähnlicher Ansatz kann verwendet werden, um einen Farbverlaufshintergrund für eine Achse zu erstellen. In diesem Fall ist es hilfreich, Achsenkoordinaten zu verwenden (extent=(0, 1, 0, 1), transform=ax.transAxes), um unabhängig von den Datenkoordinaten zu sein.
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(19680801)
def gradient_image(ax, direction=0.3, cmap_range=(0, 1), **kwargs):
"""
Draw a gradient image based on a colormap.
Parameters
----------
ax : Axes
The Axes to draw on.
direction : float
The direction of the gradient. This is a number in
range 0 (=vertical) to 1 (=horizontal).
cmap_range : float, float
The fraction (cmin, cmax) of the colormap that should be
used for the gradient, where the complete colormap is (0, 1).
**kwargs
Other parameters are passed on to `.Axes.imshow()`.
In particular, *cmap*, *extent*, and *transform* may be useful.
"""
phi = direction * np.pi / 2
v = np.array([np.cos(phi), np.sin(phi)])
X = np.array([[v @ [1, 0], v @ [1, 1]],
[v @ [0, 0], v @ [0, 1]]])
a, b = cmap_range
X = a + (b - a) / X.max() * X
im = ax.imshow(X, interpolation='bicubic', clim=(0, 1),
aspect='auto', **kwargs)
return im
def gradient_bar(ax, x, y, width=0.5, bottom=0):
for left, top in zip(x, y):
right = left + width
gradient_image(ax, extent=(left, right, bottom, top),
cmap=plt.cm.Blues_r, cmap_range=(0, 0.8))
fig, ax = plt.subplots()
ax.set(xlim=(0, 10), ylim=(0, 1))
# background image
gradient_image(ax, direction=1, extent=(0, 1, 0, 1), transform=ax.transAxes,
cmap=plt.cm.RdYlGn, cmap_range=(0.2, 0.8), alpha=0.5)
N = 10
x = np.arange(N) + 0.15
y = np.random.rand(N)
gradient_bar(ax, x, y, width=0.7)
plt.show()
Gesamtlaufzeit des Skripts: (0 Minuten 1,173 Sekunden)