Balkendiagramm mit Farbverläufen #

Matplotlib unterstützt nativ keine Farbverläufe. Wir können jedoch ein mit Farbverläufen gefülltes Rechteck mit AxesImageder richtigen Größe und Farbe emulieren.

Insbesondere verwenden wir eine Farbkarte, um die tatsächlichen Farben zu erzeugen. Es reicht dann aus, die zugrunde liegenden Werte an den Ecken des Bildes zu definieren und die Fläche durch bikubische Interpolation ausfüllen zu lassen. Wir definieren die Gradientenrichtung durch einen Einheitsvektor v . Die Werte an den Ecken ergeben sich dann aus den Längen der Projektionen der Eckenvektoren auf v .

Ein ähnlicher Ansatz kann verwendet werden, um einen Hintergrund mit Farbverlauf für Achsen zu erstellen. In diesem Fall ist es hilfreich, Achsenkoordinaten ( ) zu verwenden, um von den Datenkoordinaten unabhängig zu sein.extent=(0, 1, 0, 1), transform=ax.transAxes

Verlaufsbalken
import matplotlib.pyplot as plt
import numpy as np

np.random.seed(19680801)


def gradient_image(ax, extent, direction=0.3, cmap_range=(0, 1), **kwargs):
    """
    Draw a gradient image based on a colormap.

    Parameters
    ----------
    ax : Axes
        The axes to draw on.
    extent
        The extent of the image as (xmin, xmax, ymin, ymax).
        By default, this is in Axes coordinates but may be
        changed using the *transform* keyword argument.
    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 useful is *cmap*.
    """
    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, extent=extent, interpolation='bicubic',
                   vmin=0, vmax=1, **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))


xmin, xmax = xlim = 0, 10
ymin, ymax = ylim = 0, 1

fig, ax = plt.subplots()
ax.set(xlim=xlim, ylim=ylim, autoscale_on=False)

# 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)
ax.set_aspect('auto')
plt.show()

Galerie generiert von Sphinx-Gallery