Seaborn est une bibliothèque construite au dessus Matplotlib. Elle améliore le rendu graphique par défaut de Matplotlib et offre des graphiques statistiques. Il est souvent plus simple d'essayer de faire sa figure directement sous Seaborn et si le rendu n'est pas satisfaisant ou qu'on ne peut pas faire ce qu'on désire, alors on utilise Matplotlib.

Seaborn est prévu pour fonctionner avec Pandas mais on peut l'utiliser sans Pandas.

Références¶

  • liste des fonctions
  • gallerie d'exemples
In [1]:
import matplotlib.pyplot as plt
import seaborn as sns

%matplotlib inline
%config InlineBackend.figure_format = 'retina'

sns.__version__
Out[1]:
'0.13.2'

Rendu graphique¶

Une des forces de Seaborn est de faire de jolis dessins et d'offrir différents styles. On pourra regarder https://seaborn.pydata.org/tutorial/aesthetics.html pour plus de détail.

In [2]:
sns.set_style('whitegrid')   # background
sns.set_context("notebook")  # change size of font, can be: paper (default), notebook, talk, poster

Des données pour faire de beaux graphiques¶

On va travailler avec la liste des maires de France élus en 2014.

In [3]:
import pandas as pd
import datetime as dt
import numpy as np

mayors = pd.read_excel("data/maires-2014.xlsx")
In [4]:
mayors.head()
Out[4]:
Unnamed: 0 Code du département (Maire) Libellé de département (Maires) Code Insee de la commune Libellé de la commune Population de la commune Nom de l'élu Prénom de l'élu Genre Date de naissance Code profession Libellé de la profession Age Type profession
0 0 1 AIN 1 L'Abergement-Clémenciat 780 BOULON Daniel M 1951-03-04 61 Retraités salariés privés 67.482612 retraité
1 1 1 AIN 2 L'Abergement-de-Varey 234 ORSET Max M 1947-11-02 65 Autres retraités 70.817383 retraité
2 2 1 AIN 4 Ambérieu-en-Bugey 13839 FABRE Daniel M 1961-09-07 51 Cadres (entreprises publiques) 56.969050 entrep. publique
3 3 1 AIN 5 Ambérieux-en-Dombes 1600 PERNET Pierre M 1961-07-29 42 Professeurs du secondaire et techn. 57.078566 enseignement
4 4 1 AIN 6 Ambléon 112 BIONDA Annie F 1951-11-28 63 Retraités fonct.publique (sf enseig.) 66.746115 retraité
In [5]:
mayors.Genre.value_counts()
Out[5]:
Genre
M    30171
F     5715
Name: count, dtype: int64

Présentation des données¶

Relation plot relplot permet de présenter les données suivant un nuage de points ou une courbe :

  • sous forme de points avec l'argument kind = "scatter" ou plus directement avec scatterplot (valeur par défaut)
  • sous forme de courbe avec l'argument kind = "line" ou plus directement avec lineplot

Une simple courbe¶

Comme indiqué initialement, Seaborn fonctionne bien avec Pandas mais pour commencer regardons comment afficher une simple courbe avec des valeurs pour x et d'autres pour y. On va trier les communes par leur population et afficher les tailles dans l'ordre afin de voir la répartition des communes suivant leur taille. Pour cela on est obligé d'utiliser lineplot car relplot demande un DataFrame.

In [6]:
ax = sns.lineplot(x=np.arange(len(mayors)), y=np.sort(mayors['Population de la commune']))
ax.set_title('Taille des %d communes' % len(mayors))
ax.set(yscale='log') # you can try without a logarithm scale in y to see the result
Out[6]:
[None]
No description has been provided for this image

On note qu'il y a plus de communes en dessous de 100 habitants qu'au dessus de 10 000 habitants.

Distribution des données¶

On peut vouloir regarder la corrélation entre deux champs. Ainsi les maires ont un âge et leur ville a un nombre d'habitant ce qui permet d'afficher l'âge en fonction de la taille de la population (pour voir si plus une ville est grande, plus son maire est âgé par exemple).

In [7]:
g = sns.relplot(data=mayors, x='Age', y='Population de la commune')
g.set(yscale='log') # same, without the log scale we cannot see anything
Out[7]:
<seaborn.axisgrid.FacetGrid at 0x7f043e2d2450>
No description has been provided for this image

On peut aussi utiliser la couleur pour indiquer un troisième champs (argument hue) qui peut être une valeur réelle ou pas. La profession du maire ou son sexe par exemple sont des catégories et non des valeurs réelles mais cela convient.

On peut avoir un quatrième champs (argument col) mais alors il doit être une catégorie puisqu'on dessinera une figure par valeur.

In [8]:
sns.set_style('dark')
sns.set_context("talk")
In [9]:
color_profession = {'agriculture':'g','industrie/commerce':'brown', 'privé':'cyan', 'libéral':'b', 'divers':'pink',
                    'fonctionnaire':'yellow', 'enseignement':'orange', 'entrep. publique':'r', 'retraité':'black'}
g = sns.relplot(data=mayors, x='Age', y='Population de la commune', hue='Type profession', palette=color_profession,
                marker='.', col='Genre')
g.set(yscale='log')
Out[9]:
<seaborn.axisgrid.FacetGrid at 0x7f043ee93610>
No description has been provided for this image
In [10]:
sns.set_style('white')
sns.set_context("notebook")
g = sns.relplot(data=mayors, x='Age', y='Population de la commune', hue='Genre', col='Type profession', col_wrap=3)
g.set(yscale='log', xlim=(20,100), ylim=(1,3000000))
Out[10]:
<seaborn.axisgrid.FacetGrid at 0x7f043e301a90>
No description has been provided for this image

Corrélation globale de N champs 2 à 2¶

pairplot offre une vision globale des corrélations entre tous les champs d'un jeu de données. Il affiche une matrice NxN de figures (avec N le nombre de champs pris en compte) avec pour la répartition d'un champs par rapport à un autre et sur la diagonale l'histogramme du champs concerné.

Il est possible d'avoir un champs qui définie la couleur avec l'argument hue. Ce champs n'est pas pris en compte dans le nombre N de la matrice.

In [11]:
sns.set_style('darkgrid')
In [12]:
mayors['Taille commune'] = np.log10(mayors['Population de la commune'])
sns.pairplot(data=mayors[mayors['Type profession']=='fonctionnaire'][['Age', 'Taille commune', 'Genre']], 
             markers='+', hue='Genre', aspect=2)
Out[12]:
<seaborn.axisgrid.PairGrid at 0x7f043d5fd190>