> Modules non standards > Seaborn > FacetGrid
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', 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