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()
gradient bar

Schlagwörter: styling: color plot-type: imshow level: intermediate purpose: showcase

Gesamtlaufzeit des Skripts: (0 Minuten 1,173 Sekunden)

Galerie generiert von Sphinx-Gallery