2017-05-18 1 views
1

Il semble que tracer une ligne reliant les valeurs moyennes des boîtes à moustaches serait une chose simple à faire, mais je ne pouvais pas comprendre comment faire cette intrigue chez les pandas.Python 2.7 et Pandas Boxplot reliant les valeurs médianes

J'utilise cette syntaxe pour faire le boxplot afin qu'il génère automatiquement le tracé de la boîte Y vs. dispositif X sans avoir à faire une manipulation externe de la trame de données:

df.boxplot(column='Y_Data', by="Category", showfliers=True, showmeans=True) 

enter image description here

Une façon que je pensais faire est de simplement faire un tracé de lignes en obtenant les valeurs moyennes de la boîte à moustaches, mais je ne suis pas sûr de savoir comment extraire cette information de l'intrigue.

Répondre

1

Vous pouvez enregistrer l'objet d'axe renvoyé par df.boxplot() et tracer les moyennes sous la forme d'un tracé linéaire utilisant ce même axe. Je suggère d'utiliser pointplot Seaborn pour les lignes, car il gère bien un axe X catégorique.

D'abord Générons certaines données de l'échantillon:

import pandas as pd 
import numpy as np 
import seaborn as sns 

N = 150 
values = np.random.random(size=N) 
groups = np.random.choice(['A','B','C'], size=N) 
df = pd.DataFrame({'value':values, 'group':groups}) 

print(df.head()) 
    group  value 
0  A 0.816847 
1  A 0.468465 
2  C 0.871975 
3  B 0.933708 
4  A 0.480170 
       ... 

Ensuite, faites la boxplot et enregistrer l'objet d'axe:

ax = df.boxplot(column='value', by='group', showfliers=True, 
       positions=range(df.group.unique().shape[0])) 

Note: Il y a un argument positions curieux Pyplot/Pandas boxplot(), qui peut provoquer des erreurs hors-par-un. Voir plus dans this discussion, y compris la solution de contournement que j'ai employé ici.

Enfin, utilisez groupby pour obtenir la catégorie signifie, puis connectez les valeurs moyennes avec un tracé linéaire superposé au-dessus de la boîte à moustaches:

sns.pointplot(x='group', y='value', data=df.groupby('group', as_index=False).mean(), ax=ax) 

boxplot

Votre titre mentionne « médiane », mais vous parlez à propos de la catégorie signifie dans votre message. J'ai utilisé des moyens ici; changez l'agrégation groupby en median() si vous voulez tracer des médianes à la place.

+0

Une excellente réponse! Je n'ai pas utilisé le package Seaborn mais j'ai l'impression que c'est un choix logique de le faire et j'ai déjà toutes les dépendances. Merci! – Patratacus