2016-02-01 10 views
5

Ich würde gerne eine Reihe von Verteilungen von Noten vergleichen (score), nach einigen Kategorien() gruppiert und von einigen anderen (model) gefärbt. Ich habe mit Seaborn folgenden versucht:Tweaking seaborn.boxplot

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") 

Es gibt einige Probleme, die ich mit diesem Grundstück habe:

  • Es gibt eine große Menge von Ausreißern und Ich mag nicht, wie sie hier gezeichnet werden . Kann ich sie entfernen? Kann ich das Aussehen ändern, um weniger Unordnung zu zeigen? Kann ich sie mindestens so einfärben, dass ihre Farbe der Boxfarbe entspricht?
  • Der model Wert original ist speziell, weil alle anderen Verteilungen mit der Verteilung von original verglichen werden sollten. Dies sollte visuell in der Handlung widergespiegelt werden. Kann ich original die erste Box jeder Gruppe machen? Kann ich es irgendwie ausgleichen oder markieren? Wäre es möglich, eine horizontale Linie durch den Median jeder original Verteilung und durch die Gruppe von Kästen zu ziehen?
  • einige der Werte von score sind sehr klein, wie richtige Skalierung der y-Achse zu tun, um sie zu zeigen?

enter image description here

EDIT:

Hier ist ein Beispiel mit einer log-skalierten y-Achse - auch noch nicht ideal. Warum scheinen die einzelnen Boxen am unteren Ende abgeschnitten zu sein?

enter image description here

+1

Die blauen Ausreißer sind ein Matplotlib-Bug und können durch Aktualisieren Ihres Seaborns vermieden werden. Aber ich würde die Ausreißer nicht einfach entfernen! – mwaskom

+2

Haben Sie versucht [log-scaling] (http://stanford.edu/~mwaskom/software/seaborn/examples/horizontal_boxplot.html) die y-Variable? – mwaskom

+0

@mwaskom Ja, aber das "komprimiert" die Balken mit größeren Werten ganz oben auf der Handlung. Gibt es einen Kompromiss, d. H. Log-Skalierung nur für einen Teil der Achse? – clstaudt

Antwort

14

Ausreißer Anzeige

Sie sollten alle Argumente seaborn.boxplot passieren können, dass Sie plt.boxplot (siehe documentation) passieren können, so dass Sie die Anzeige des Ausreißer einstellen könnten flierprops indem . Here sind einige Beispiele dafür, was Sie mit Ihren Ausreißern machen können.

Wenn Sie nicht anzeigen möchten, können Sie

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

tun oder man könnte wie so sie hellgrau machen:

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

Reihenfolge der Gruppen

Sie können die Reihenfolge der Gruppen manuell mit hue_order festlegen, z

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

Skalierung der y-Achse

Sie könnten nur die Minimal- und Maximalwerte aller und stellen y_lim y-Werte erhalten entsprechend?Etwas wie folgt aus:

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: Dieser letzte Punkt nicht wirklich sinnvoll, da die automatische y_lim Bereich bereits werden alle Werte sind, aber ich verlasse es nur als ein Beispiel dafür, wie diese Einstellungen anpassen . Wie in den Kommentaren erwähnt, ist Log-Scaling wahrscheinlich sinnvoller.

Verwandte Themen