Matplotlib Boîte Ruban

Beginner

This tutorial is from open-source community. Access the source code

Introduction

Matplotlib est une bibliothèque populaire de visualisation de données pour Python. Ce tutoriel vous guidera dans la création d'un graphique en boîte ruban, une manière unique de visualiser des données. Un graphique en boîte ruban est un graphique en barres empilées où chaque barre est "en forme de ruban" et a un schéma de couleurs graduées.

Conseils sur la machine virtuelle

Une fois le démarrage de la machine virtuelle terminé, cliquez dans le coin supérieur gauche pour basculer vers l'onglet Carnet de notes pour accéder à Jupyter Notebook pour la pratique.

Parfois, vous devrez peut-être attendre quelques secondes pour que Jupyter Notebook ait fini de charger. La validation des opérations ne peut pas être automatisée en raison des limitations de Jupyter Notebook.

Si vous rencontrez des problèmes pendant l'apprentissage, n'hésitez pas à demander à Labby. Donnez votre feedback après la session, et nous résoudrons rapidement le problème pour vous.

Importation des bibliothèques et chargement des données

Dans cette étape, nous allons importer les bibliothèques nécessaires et charger les données.

import matplotlib.pyplot as plt
import numpy as np
from matplotlib import cbook
from matplotlib import colors as mcolors
from matplotlib.image import AxesImage
from matplotlib.transforms import Bbox, BboxTransformTo, TransformedBbox

Création de la classe RibbonBox

Dans cette étape, nous allons créer la classe RibbonBox qui sera utilisée pour créer les couleurs graduées des boîtes ruban.

class RibbonBox:
    ## Chargez l'image de la boîte ruban
    original_image = plt.imread(cbook.get_sample_data("Minduka_Present_Blue_Pack.png"))
    cut_location = 70
    b_and_h = original_image[:, :, 2:3]
    color = original_image[:, :, 2:3] - original_image[:, :, 0:1]
    alpha = original_image[:, :, 3:4]
    nx = original_image.shape[1]

    def __init__(self, color):
        rgb = mcolors.to_rgb(color)
        self.im = np.dstack([self.b_and_h - self.color * (1 - np.array(rgb)), self.alpha])

    def get_stretched_image(self, stretch_factor):
        stretch_factor = max(stretch_factor, 1)
        ny, nx, nch = self.im.shape
        ny2 = int(ny*stretch_factor)
        return np.vstack([self.im[:self.cut_location],
                          np.broadcast_to(self.im[self.cut_location], (ny2 - ny, nx, nch)),
                          self.im[self.cut_location:]])

Création de la classe RibbonBoxImage

Dans cette étape, nous allons créer la classe RibbonBoxImage qui sera utilisée pour créer les boîtes ruban réelles.

class RibbonBoxImage(AxesImage):
    zorder = 1

    def __init__(self, ax, bbox, color, *, extent=(0, 1, 0, 1), **kwargs):
        super().__init__(ax, extent=extent, **kwargs)
        self._bbox = bbox
        self._ribbonbox = RibbonBox(color)
        self.set_transform(BboxTransformTo(bbox))

    def draw(self, renderer, *args, **kwargs):
        stretch_factor = self._bbox.height / self._bbox.width

        ny = int(stretch_factor*self._ribbonbox.nx)
        if self.get_array() is None or self.get_array().shape[0]!= ny:
            arr = self._ribbonbox.get_stretched_image(stretch_factor)
            self.set_array(arr)

        super().draw(renderer, *args, **kwargs)

Création du graphique

Dans cette étape, nous allons créer le graphique réel en utilisant la classe RibbonBoxImage pour créer les boîtes ruban.

def main():
    fig, ax = plt.subplots()

    years = np.arange(2004, 2009)
    heights = [7900, 8100, 7900, 6900, 2800]
    box_colors = [(0.8, 0.2, 0.2),
                  (0.2, 0.8, 0.2),
                  (0.2, 0.2, 0.8),
                  (0.7, 0.5, 0.8),
                  (0.3, 0.8, 0.7)]

    for year, h, bc in zip(years, heights, box_colors):
        bbox0 = Bbox.from_extents(year - 0.4, 0., year + 0.4, h)
        bbox = TransformedBbox(bbox0, ax.transData)
        ax.add_artist(RibbonBoxImage(ax, bbox, bc, interpolation="bicubic"))
        ax.annotate(str(h), (year, h), va="bottom", ha="center")

    ax.set_xlim(years[0] - 0.5, years[-1] + 0.5)
    ax.set_ylim(0, 10000)

    ## Crée un gradient d'arrière-plan
    background_gradient = np.zeros((2, 2, 4))
    background_gradient[:, :, :3] = [1, 1, 0]
    background_gradient[:, :, 3] = [[0.1, 0.3], [0.3, 0.5]]
    ax.imshow(background_gradient, interpolation="bicubic", zorder=0.1,
              extent=(0, 1, 0, 1), transform=ax.transAxes, aspect="auto")

    plt.show()

main()

Comprendre le graphique

Dans cette étape, nous allons discuter du graphique que nous avons créé. Le graphique est composé de boîtes ruban empilées les unes sur les autres pour former un graphique en barres. La hauteur de chaque boîte ruban correspond à une valeur dans l'ensemble de données. Les boîtes ruban ont un schéma de couleurs graduées qui les rend visuellement attrayantes.

Sommaire

Dans ce tutoriel, nous avons appris à créer un graphique à boîtes ruban à l'aide de Matplotlib. Nous avons créé les classes RibbonBox et RibbonBoxImage pour créer respectivement les couleurs graduées et les boîtes ruban réelles. Nous avons ensuite utilisé ces classes pour créer le graphique, qui est composé de boîtes ruban empilées les unes sur les autres pour former un graphique en barres.