Graphique à barres avec dégradés #

Matplotlib ne prend pas en charge nativement les dégradés. Cependant, nous pouvons émuler un rectangle rempli de dégradé par un rectangle AxesImagede la bonne taille et de la bonne couleur.

En particulier, nous utilisons une palette de couleurs pour générer les couleurs réelles. Il suffit alors de définir les valeurs sous-jacentes sur les coins de l'image et de laisser l'interpolation bicubique remplir la zone. Nous définissons la direction du gradient par un vecteur unitaire v . Les valeurs aux coins sont alors obtenues par les longueurs des projections des vecteurs coins sur v .

Une approche similaire peut être utilisée pour créer un arrière-plan dégradé pour un Axes. Dans ce cas, il est utile d'utiliser les coordonnées des axes ( ) pour être indépendantes des coordonnées des données.extent=(0, 1, 0, 1), transform=ax.transAxes

barre de dégradé
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 générée par Sphinx-Gallery