Noter
Cliquez ici pour télécharger l'exemple de code complet
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 AxesImage
de 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
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()