web-dev-qa-db-fra.com

Ajustement de seaborn.boxplot

Je voudrais comparer un ensemble de distributions de scores (score), regroupées par certaines catégories (centrality) et colorées par d'autres (model). J'ai essayé ce qui suit avec Seaborn:

plt.figure(figsize=(14,6))
seaborn.boxplot(x="centrality", y="score", hue="model", data=data, palette=seaborn.color_palette("husl", len(models) +1))
seaborn.despine(offset=10, trim=True)
plt.savefig("/home/i11/staudt/Eval/properties-replication-test.pdf", bbox_inches="tight")

Il y a quelques problèmes que j'ai avec ce complot:

  • Il y a une grande quantité de valeurs aberrantes et je n'aime pas comment elles sont dessinées ici. Puis-je les supprimer? Puis-je changer l'apparence pour montrer moins d'encombrement? Puis-je les colorier au moins pour que leur couleur corresponde à la couleur de la boîte?
  • La valeur modeloriginal est spéciale car toutes les autres distributions doivent être comparées à la distribution de original. Cela devrait se refléter visuellement dans l'intrigue. Puis-je faire de original la première case de chaque groupe? Puis-je compenser ou marquer différemment d'une manière ou d'une autre? Serait-il possible de tracer une ligne horizontale à travers la médiane de chaque distribution original et à travers le groupe de cases?
  • certaines des valeurs de score sont très petites, comment faire une mise à l'échelle correcte de l'axe des y pour les afficher?

enter image description here

ÉDITER:

Voici un exemple avec un axe y à échelle logarithmique - pas encore idéal non plus. Pourquoi certaines cases semblent-elles coupées au bas de gamme?

enter image description here

17
clstaudt

Affichage des valeurs aberrantes

Vous devriez pouvoir passer tous les arguments à seaborn.boxplot Que vous pouvez passer à plt.boxplot (Voir documentation ), afin que vous puissiez ajuster l'affichage des valeurs aberrantes en définissant flierprops. Ici sont quelques exemples de ce que vous pouvez faire avec vos valeurs aberrantes.

Si vous ne voulez pas les afficher, vous pouvez le faire

seaborn.boxplot(x="centrality", y="score", hue="model", data=data,
                showfliers=False)

ou vous pouvez les rendre gris clair comme ceci:

flierprops = dict(markerfacecolor='0.75', markersize=5,
              linestyle='none')
seaborn.boxplot(x="centrality", y="score", hue="model", data=data,
                flierprops=flierprops)

Ordre des groupes

Vous pouvez définir manuellement l'ordre des groupes avec hue_order, Par ex.

seaborn.boxplot(x="centrality", y="score", hue="model", data=data,
                hue_order=["original", "Havel..","etc"])

Mise à l'échelle de l'axe y

Vous pouvez simplement obtenir les valeurs minimales et maximales de toutes les valeurs y et définir y_lim En conséquence? Quelque chose comme ça:

y_values = data["scores"].values
seaborn.boxplot(x="centrality", y="score", hue="model", data=data,
                y_lim=(np.min(y_values),np.max(y_values)))

EDIT: Ce dernier point n'a pas vraiment de sens puisque la plage automatique y_lim Inclura déjà toutes les valeurs, mais je le laisse juste comme un exemple de la façon d'ajuster ces paramètres. Comme mentionné dans les commentaires, la mise à l'échelle des journaux est probablement plus logique.

42
Lisa