web-dev-qa-db-fra.com

Boxplot de plusieurs colonnes d'un Pandas Dataframe sur la même figure (seaborn)

Je sens que je ne pense probablement pas à quelque chose d'évident. Je veux mettre dans la même figure, la boîte à moustaches de chaque colonne d'une trame de données, où sur l'axe des x j'ai les noms des colonnes. Dans la seaborn.boxplot() ce serait égal à groupby par chaque colonne.

Dans pandas je ferais

df = pd.DataFrame(data = np.random.random(size=(4,4)), columns = ['A','B','C','D'])
df.boxplot()

qui donne

enter image description here

Maintenant, j'aimerais obtenir la même chose chez seaborn. Mais lorsque j'essaie sns.boxplot (df), je n'ai qu'un seul boxplot groupé. Comment reproduire la même figure dans Seaborn?

merci

12
Duccio Piovani

L'équivalent marin de

df.boxplot()

est

sns.boxplot(x="variable", y="value", data=pd.melt(df))

Exemple complet:

import numpy as np; np.random.seed(42)
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.DataFrame(data = np.random.random(size=(4,4)), columns = ['A','B','C','D'])

sns.boxplot(x="variable", y="value", data=pd.melt(df))

plt.show()

enter image description here

Cela fonctionne parce que pd.melt convertit une trame de données au format large

          A         B         C         D
0  0.374540  0.950714  0.731994  0.598658
1  0.156019  0.155995  0.058084  0.866176
2  0.601115  0.708073  0.020584  0.969910
3  0.832443  0.212339  0.181825  0.183405

en forme longue

   variable     value
0         A  0.374540
1         A  0.156019
2         A  0.601115
3         A  0.832443
4         B  0.950714
5         B  0.155995
6         B  0.708073
7         B  0.212339
8         C  0.731994
9         C  0.058084
10        C  0.020584
11        C  0.181825
12        D  0.598658
13        D  0.866176
14        D  0.969910
15        D  0.183405
25

Vous pouvez utiliser la méthode pandas intégrée df.plot (kind = 'box') comme suggéré dans cette question .
Je me rends compte que cette réponse ne vous aidera pas si vous avez pour utiliser seaborn, mais elle peut être utile pour les personnes ayant des exigences plus simples.

import numpy as np; np.random.seed(42)
import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame(data = np.random.random(size=(4,4)), columns = ['A','B','C','D'])

df.plot(kind='box')
plt.show()
1
RafaP