Mis a jour le 2025-04-14, 12:10

FacetGrid

Permet de faire des graphes multiples en fonction de valeurs de catégories en utilisant une fonction de matplotlib.
scatterplots en fonction des valeurs discrètes de C1, C2 et C3 :
  • fg = seaborn.FacetGrid(df, row = 'C1', col = 'C2', hue = 'C3') : déclare un facet grid pour un dataframe avec des graphes en ligne pour les valeurs de C1, en colonne pour les valeurs de C2 et grâce à des couleurs différentes pour les valeurs de C3.
  • si une seule variable dont dépendent les graphes, donner seulement col : fg = seaborn.FacetGrid(df, col = 'C1')
  • puis on appelle la fonction graphique en donnant les variables (ici les colonnes A et B du dataframe) et les paramètres qu'elle doit prendre : fg.map(pyplot.scatter, 'A', 'B', s = 5)
  • on ne peut pas utiliser les fonctions comme relplot, displot, ... Il faut utiliser les fonctions précises comme scatterplot, histplot, ...
Exemple : df = seaborn.load_dataset('penguins') fg = seaborn.FacetGrid(data = df, row = 'species', col = 'island', hue = 'sex') fg.map(seaborn.scatterplot, 'flipper_length_mm', 'body_mass_g') fg.add_legend()
Avec map_dataframe, on peut passer des arguments nommés :
  • fg.map_dataframe(seaborn.scatterplot, x = 'flipper_length_mm', y = 'body_mass_g')
  • fg.map_dataframe(seaborn.boxplot, x = 'sex', y = 'flipper_length_mm', color = 'skyblue')
Si on veut avoir par exemple des barplots avec un couleur par graphe, on peut faire : fg = seaborn.FacetGrid(df, col = 'C1', col_wrap = 4); fg.map_dataframe(seaborn.barplot, x = 'C2', y = 'C3', hue = 'C1', palette = {'a': 'green', 'b': 'blue', 'c': 'orange'})
Arguments de FacetGrid :
  • col_wrap = 2 : uniquement si seul col est défini (pas row), indique le nombre de colonne max après lequel on retourne à la ligne.
  • sharey = True : les graduations sur l'axe des y sont partagées (défaut). Sinon : False (graduations non partagées), 'col' (partagées sur une colonne), 'row' (partagées sur une ligne)
  • sharex = True : les graduations sur l'axe des x sont partagées (défaut). Sinon : False (graduations non partagées), 'col' (partagées sur une colonne), 'row' (partagées sur une ligne)
  • height = 5 : hauteur des graphes (en pouces), défaut = 3
  • aspect = 1 : ratio largeur / hauteur (défaut = 1)
  • palette = {'Male': 'red', 'Female': 'green'}
  • row_order = ['Gentoo', 'Adelie', 'Chinstrap'] : ordre des valeurs sur les lignes
  • col_order : ordre des valeurs sur les colonnes
  • hue_order : ordre des valeurs sur les hue
  • legend_out = True : la légende est dehors des graphes (défaut)
  • xlim = [0, 250] : valeurs minimum et maximum de x (si sharex = True)
  • ylim : valeurs minimum et maximum de y (si sharey = True)
  • margin_titles = True : met les valeurs des paramètres en ligne et colonne dans les marges plutôt qu'au-dessus de chaque graphe (défaut est False)
  • despine = False : entoure chaque graphe avec les 4 axes (left et bottom, mais aussi top et right. Le défaut est True)
Méthodes de FacetGrid :
  • fg.fig.axes : la liste de tous les graphes : c'est une arrray 1d si seulement "col" a été donnée, c'est une array 2d si "col" et "row" ont été donnés. Si c'est une array 2d, on peut boucler dessus en utilisant à la place : fg.fig.axes.flat
  • fg.set_axis_labels(x_var = 'x label', y_var = 'y label') : permet de fixer le nom des axes.
  • fg.set_titles(template = 'species:{col_name}, island:{row_name}') : permet de configurer les titres comme on veut (col_name et var_name sont remplacés par le nom des variables).
  • fg.set_titles(template = '{col_name}', size = 10) : si juste une seule variable et en indiquant la taille de la police.
  • on peut customiser les titres un par un :
    for ax in fg.fig.axes:
      ax.set_title('title : ' + ax.get_title())
          
  • pour mettre un titre général à toute la figure : pyplot.suptitle('my title')
  • fg.set_xlabels('my label for x') : pour rajouter le même label en X à tous les graphes.
  • fg.add_legend(title = 'myTitle', fontsize = 10, loc = (0.85, 0.4)) : pour rajouter une légende (quand il y a une hue), en indiquant la position de la légende en coordonnées x,y entre 0 et 1. On peut aussi utiliser loc = 'lower right') par exemple.
  • fg.tight_layout() : comme pour un graphe simple.
  • fg.set(xticks = [1, 3, 5, 7]) : met les ticks indiqué sur tous les graphes.
  • exemple plus sophistiqué pour customisation complète :
    for ax in fg.fig.axes.flat:
        ax.set(xlabel = '', ylabel = '% of reads')
        ax.tick_params(axis = 'x', rotation = 90)
        ax.yaxis.set_ticks([10 * x for x in range(11)])
        for label in ax.yaxis.get_ticklabels():
            label.set_fontsize(10)
        ax.grid(axis = 'y', color = 'gray', linewidth = 0.5, linestyle = 'dotted')
        ax.set_axisbelow(True)
        
Sauvegarde dans un fichier : fg.savefig('myImage.png')
Attention pour les barplots, si le dataframe n'est pas complet (i.e. ici, des valeurs de C pour lesquelles des valeurs de A sont absentes), il faut absolument rajouter order (ou alors rendre le dataframe complet avec des 0 sur les valeurs manquantes) : df = pandas.DataFrame({'A': ['a', 'a', 'b', 'b', 'a'], 'B': [1, 2, 3, 1, 4], 'C': ['c', 'd', 'c', 'd', 'e']}) fg = seaborn.FacetGrid(df, col = 'C') fg.map_dataframe(seaborn.barplot, x = 'A', y = 'B', hue = 'A', palette = {'a': 'red', 'b': 'green'}, order = ['a', 'b'])
On peut changer les propriétés d'un graphe en particulier :
  • fg.axes[0][1] : permet de récupérer un objet axes (1ère ligne, 2ème colonne)
  • fg.axes[0][1].set(title = 'specific title', ylim = (2000, 8000), yscale = 'log', ylabel = 'my label') : modificationd des propriétés.
  • pyplot.sca(fg.axes[0][1]); pyplot.plot([0, 200], [0, 8000], color = 'blue') : trace une droite sur ce graphe en particulier.
fg.map_dataframe(seaborn.histplot, x = colName, color = color, discrete = True) : quand ce sont des valeurs discretes, evite d'avoir des largeurs de barres variables
Autre présentation : df = seaborn.load_dataset('penguins') fg = seaborn.FacetGrid(data = df, row = 'species', col = 'island', margin_titles = True, despine = False, hue = 'sex', palette = {'Male': 'red', 'Female': 'green'}, row_order = ['Gentoo', 'Adelie', 'Chinstrap'], legend_out = False, ylim = [0, 10000]) fg.map(seaborn.scatterplot, 'flipper_length_mm', 'body_mass_g') fg.add_legend() pyplot.sca(fg.axes[0][1]) pyplot.plot([0, 200], [0, 8000], color = 'blue') fg.figure.subplots_adjust(wspace = 0, hspace = 0)

Copyright python-simple.com
programmer en python, tutoriel python, graphes en python, Aymeric Duclert