Créer des graphiques radar avec Matplotlib pour Python

PythonPythonBeginner
Pratiquer maintenant

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

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans ce laboratoire, vous allez apprendre à créer un graphique radar à l'aide de la bibliothèque Matplotlib de Python. Un graphique radar, également connu sous le nom de graphique araignée ou graphique étoile, est une méthode graphique de présentation de données multivariées sous forme d'un graphique bidimensionnel de trois variables quantitatives ou plus représentées sur des axes partant du même point. Il est souvent utilisé pour comparer différents produits ou solutions sur plusieurs facteurs.

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 au carnet Jupyter Notebook pour pratiquer.

Parfois, vous devrez peut-être attendre quelques secondes pour que le carnet Jupyter Notebook ait fini de charger. La validation des opérations ne peut pas être automatisée en raison des limitations du carnet 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

Tout d'abord, nous devons importer les bibliothèques nécessaires. Matplotlib et numpy sont requises pour ce tutoriel.

import matplotlib.pyplot as plt
import numpy as np

Définir la fonction de graphique radar

Ensuite, nous allons définir une fonction pour créer un graphique radar. Cette fonction prendra deux arguments : num_vars et frame. num_vars est le nombre de variables pour le graphique radar, et frame spécifie la forme du cadre entourant les axes.

from matplotlib.patches import Circle, RegularPolygon
from matplotlib.path import Path
from matplotlib.projections import register_projection
from matplotlib.projections.polar import PolarAxes
from matplotlib.spines import Spine
from matplotlib.transforms import Affine2D

def radar_factory(num_vars, frame='circle'):
    ## code for the function goes here

Définir les classes RadarTransform et RadarAxes

Dans la fonction radar_factory, nous allons définir les classes RadarTransform et RadarAxes. Ces classes seront utilisées pour créer le graphique radar.

class RadarTransform(PolarAxes.PolarTransform):
    ## code for the RadarTransform class goes here

class RadarAxes(PolarAxes):
    ## code for the RadarAxes class goes here

Définir les méthodes fill et plot

Dans la classe RadarAxes, nous allons définir les méthodes fill et plot. Ces méthodes seront utilisées respectivement pour remplir la zone à l'intérieur du graphique et tracer les points de données.

class RadarAxes(PolarAxes):
    ## code for the RadarAxes class goes here

    def fill(self, *args, closed=True, **kwargs):
        ## override the fill method
        return super().fill(closed=closed, *args, **kwargs)

    def plot(self, *args, **kwargs):
        ## override the plot method
        lines = super().plot(*args, **kwargs)
        for line in lines:
            self._close_line(line)

    def _close_line(self, line):
        ## helper method to close the line
        x, y = line.get_data()
        if x[0]!= x[-1]:
            x = np.append(x, x[0])
            y = np.append(y, y[0])
            line.set_data(x, y)

Définir les méthodes set_varlabels, _gen_axes_patch et _gen_axes_spines

Dans la classe RadarAxes, nous allons également définir les méthodes set_varlabels, _gen_axes_patch et _gen_axes_spines. Ces méthodes définiront respectivement les étiquettes des variables, généreront le patch des axes et généreront les épines des axes.

class RadarAxes(PolarAxes):
    ## code for the RadarAxes class goes here

    def set_varlabels(self, labels):
        self.set_thetagrids(np.degrees(theta), labels)

    def _gen_axes_patch(self):
        if frame == 'circle':
            return Circle((0.5, 0.5), 0.5)
        elif frame == 'polygon':
            return RegularPolygon((0.5, 0.5), num_vars,
                                  radius=.5, edgecolor="k")
        else:
            raise ValueError("Unknown value for 'frame': %s" % frame)

    def _gen_axes_spines(self):
        if frame == 'circle':
            return super()._gen_axes_spines()
        elif frame == 'polygon':
            spine = Spine(axes=self,
                          spine_type='circle',
                          path=Path.unit_regular_polygon(num_vars))
            spine.set_transform(Affine2D().scale(.5).translate(.5,.5)
                                + self.transAxes)
            return {'polar': spine}
        else:
            raise ValueError("Unknown value for 'frame': %s" % frame)

Définir les données d'exemple

Maintenant, nous allons définir les données d'exemple que nous utiliserons pour créer le graphique radar. Ces données sont issues d'une étude sur les estimations du profil des sources de pollution.

def example_data():
    data = [
        ['Sulfate', 'Nitrate', 'EC', 'OC1', 'OC2', 'OC3', 'OP', 'CO', 'O3'],
        ('Basecase', [
            [0.88, 0.01, 0.03, 0.03, 0.00, 0.06, 0.01, 0.00, 0.00],
            [0.07, 0.95, 0.04, 0.05, 0.00, 0.02, 0.01, 0.00, 0.00],
            [0.01, 0.02, 0.85, 0.19, 0.05, 0.10, 0.00, 0.00, 0.00],
            [0.02, 0.01, 0.07, 0.01, 0.21, 0.12, 0.98, 0.00, 0.00],
            [0.01, 0.01, 0.02, 0.71, 0.74, 0.70, 0.00, 0.00, 0.00]]),
        ('Avec CO', [
            [0.88, 0.02, 0.02, 0.02, 0.00, 0.05, 0.00, 0.05, 0.00],
            [0.08, 0.94, 0.04, 0.02, 0.00, 0.01, 0.12, 0.04, 0.00],
            [0.01, 0.01, 0.79, 0.10, 0.00, 0.05, 0.00, 0.31, 0.00],
            [0.00, 0.02, 0.03, 0.38, 0.31, 0.31, 0.00, 0.59, 0.00],
            [0.02, 0.02, 0.11, 0.47, 0.69, 0.58, 0.88, 0.00, 0.00]]),
        ('Avec O3', [
            [0.89, 0.01, 0.07, 0.00, 0.00, 0.05, 0.00, 0.00, 0.03],
            [0.07, 0.95, 0.05, 0.04, 0.00, 0.02, 0.12, 0.00, 0.00],
            [0.01, 0.02, 0.86, 0.27, 0.16, 0.19, 0.00, 0.00, 0.00],
            [0.01, 0.03, 0.00, 0.32, 0.29, 0.27, 0.00, 0.00, 0.95],
            [0.02, 0.00, 0.03, 0.37, 0.56, 0.47, 0.87, 0.00, 0.00]]),
        ('CO & O3', [
            [0.87, 0.01, 0.08, 0.00, 0.00, 0.04, 0.00, 0.00, 0.01],
            [0.09, 0.95, 0.02, 0.03, 0.00, 0.01, 0.13, 0.06, 0.00],
            [0.01, 0.02, 0.71, 0.24, 0.13, 0.16, 0.00, 0.50, 0.00],
            [0.01, 0.03, 0.00, 0.28, 0.24, 0.23, 0.00, 0.44, 0.88],
            [0.02, 0.00, 0.18, 0.45, 0.64, 0.55, 0.86, 0.00, 0.16]])
    ]
    return data

Définir le nombre de variables et calculer les angles des axes

Nous allons maintenant définir le nombre de variables et calculer les angles des axes régulièrement espacés en utilisant numpy.

N = 9
theta = radar_factory(N, frame='polygon')

Créer le graphique radar

Enfin, nous pouvons créer le graphique radar en utilisant les données d'exemple et la classe RadarAxes.

data = example_data()
spoke_labels = data.pop(0)

fig, axs = plt.subplots(figsize=(9, 9), nrows=2, ncols=2,
                        subplot_kw=dict(projection='radar'))
fig.subplots_adjust(wspace=0.25, hspace=0.20, top=0.85, bottom=0.05)

colors = ['b', 'r', 'g','m', 'y']
for ax, (title, case_data) in zip(axs.flat, data):
    ax.set_rgrids([0.2, 0.4, 0.6, 0.8])
    ax.set_title(title, weight='bold', size='medium', position=(0.5, 1.1),
                 horizontalalignment='center', verticalalignment='center')
    for d, color in zip(case_data, colors):
        ax.plot(theta, d, color=color)
        ax.fill(theta, d, facecolor=color, alpha=0.25, label='_nolegend_')
    ax.set_varlabels(spoke_labels)

labels = ('Factor 1', 'Factor 2', 'Factor 3', 'Factor 4', 'Factor 5')
legend = axs[0, 0].legend(labels, loc=(0.9,.95),
                          labelspacing=0.1, fontsize='small')

fig.text(0.5, 0.965, '5-Factor Solution Profiles Across Four Scenarios',
         horizontalalignment='center', color='black', weight='bold',
         size='large')

plt.show()

Sommaire

Dans ce laboratoire, vous avez appris à créer un graphique radar à l'aide de la bibliothèque Matplotlib de Python. Un graphique radar est une méthode graphique pour afficher des données multivariées sous forme d'un graphique bidimensionnel de trois variables quantitatives ou plus, représentées sur des axes partant du même point. Il est souvent utilisé pour comparer différents produits ou solutions en fonction de plusieurs facteurs.