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:
model
original
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?score
sont très petites, comment faire une mise à l'échelle correcte de l'axe des y pour les afficher?É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?
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.