Matplotlib: Vermeiden Sie überlappende Datenpunkte in einem "Streu / Punkt / Bienenwarm" -Plot
Beim zeichnen eines dot-plot mit matplotlib, ich möchte offset-überlappender Datenpunkte zu halten Sie alle sichtbar. Für Beispiele, wenn ich
CategoryA: 0,0,3,0,5
CategoryB: 5,10,5,5,10
Ich wollen, dass jeder die CategoryA
"0" Datenpunkte festgelegt werden, Seite an Seite, anstatt direkt auf der jeweils anderen, während immer noch deutlich vom CategoryB
.
In R (ggplot2
) es ist ein "jitter"
option, die dies tut. Gibt es eine ähnliche option in matplotlib, oder gibt es einen anderen Ansatz, der dazu führen würde, zu einem ähnlichen Ergebnis?
Edit: zu klären, die "beeswarm"
plot in R ist im wesentlichen, was ich im Auge habe, und pybeeswarm
ist ein Anfang, aber nützlich beginnen bei einem matplotlib/Python-version.
Edit: hinzufügen, die Seaborn ' s Swarmplot, eingeführt in version 0.7, ist eine hervorragende Umsetzung von dem, was ich wollte.
InformationsquelleAutor der Frage iayork | 2011-12-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erweiterung der Antwort von @user2467675, hier ist, wie ich es gemacht habe:
Den
stdev
variable stellt sicher, dass der jitter ist genug, um zu sehen, die auf verschiedenen Skalen, aber es wird davon ausgegangen, dass die Grenzwerte der Achsen 0 und der max-Wert.Können Sie dann rufen
jitter
stattscatter
.InformationsquelleAutor der Antwort yoavram
Ich verwendet numpy.zufällig "scatter/beeswarm" die Daten entlang der X-Achse, sondern um einen festen Punkt in jeder Kategorie, und dann im Grunde tun pyplot.scatter() für jede Kategorie:
InformationsquelleAutor der Antwort sun.huaiyu
Nicht zu wissen, der eine direkte mpl alternative hier aus haben Sie einen sehr rudimentären Vorschlag:
InformationsquelleAutor der Antwort joaquin
Ein Weg der Annäherung an das problem zu denken, jede 'Zeile' in der scatter/dot/beeswarm plot " als ein bin in einem Histogramm:
Dieser offensichtlich beinhaltet die Gruppierung der Daten, so verlieren Sie möglicherweise einige Präzision. Wenn Sie diskrete Daten, die Sie ersetzen könnte:
mit:
Einen alternativen Ansatz, der erhält die genaue y-Koordinaten, auch für kontinuierliche Daten, ist die Verwendung eines kernel-Dichte-Schätzung zum skalieren der amplitude der random-jitter in der x-Achse:
Diese zweite Methode basiert lose auf, wie violin plots Arbeit. Dennoch ist es nicht garantiert, dass keiner der Punkte überschneiden, aber ich finde, dass in der Praxis neigt dazu, ganz nett aussehende Ergebnisse so lange, wie es eine anständige Anzahl der Punkte (>20), und die Verteilung kann einigermaßen gut angenähert durch eine Summe von gaussfunktionen.
InformationsquelleAutor der Antwort ali_m
Seaborn bietet eine Histogramm-wie beim kategorischen dot-plots durch
sns.swarmplot()
und jittered kategorische dot-plots übersns.stripplot()
:InformationsquelleAutor der Antwort Joel Ostblom
Seaborn 's swarmplot scheint, wie die meisten apt-fit für das, was Sie im Sinn haben, aber Sie können auch jitter mit Seaborn' s regplot:
InformationsquelleAutor der Antwort wordsforthewise