Scatterplot-Konturen In Matplotlib
Habe ich eine massive scatterplot (~100.000 Punkte), dass ich zu generieren in matplotlib. Jeder Punkt hat eine Position in dieser x/y-Raum, und ich möchte zu erzeugen Konturen, die bestimmte Perzentile der Gesamtzahl der Punkte.
Gibt es eine Funktion in matplotlib was wird dies? Ich habe mir in Kontur(), aber ich würde das schreiben meiner eigenen Funktion auf diese Weise arbeiten.
Dank!
InformationsquelleAutor astromax | 2013-10-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Im Grunde, Sie wollen, sind eine Dichte Schätzung einiger Sortieren. Es gibt mehrere Möglichkeiten, dies zu tun:
Verwenden Sie ein 2D-Histogramm von einer Art (z.B.
matplotlib.pyplot.hist2d
odermatplotlib.pyplot.hexbin
) (Sie können auch die Anzeige der Ergebnisse als Kontur-nur die Verwendungnumpy.histogram2d
und dann die Kontur das resultierende array.)Machen eine kernel-Dichte-Schätzung (KDE) und Kontur der Ergebnisse. KDE ist im wesentlichen eine geglättete Histogramm. Statt einen Punkt fallen, in ein bestimmtes bin, es fügt Gewicht auf die umliegenden bins (in der Regel in der Form einer Gaußschen "Glockenkurve").
Mit einem 2D-Histogramm ist einfach und leicht zu verstehen, aber fundementally gibt "blocky" Ergebnisse.
Gibt es einige Falten zu tun, der zweite "richtig" (d.h. es gibt keine einzig richtige Weg). Ich gehe nicht in die details gehen hier, aber wenn Sie wollen, die Ergebnisse zu interpretieren, statistisch gesehen, die Sie benötigen, zu Lesen (besonders die Bandbreite).
Jedenfalls, hier ist ein Beispiel für die Unterschiede. Ich werde den plot jeweils ähnlich, also werde ich nicht verwenden Konturen, aber Sie könnten genauso leicht zeichnen Sie die 2D-Histogramm oder Gauß-KDE mit einem Kontur-plot:
Einen Nachteil: Mit einer sehr großen Anzahl von Punkten, die
scipy.stats.gaussian_kde
wird sehr langsam. Es ist ziemlich einfach, es zu beschleunigen, indem eine Annäherung--nehmen Sie einfach die 2D-Histogramm und verwischen Sie es mit einem guassian filter des rechten radius und Kovarianz. Ich kann ein Beispiel geben, wenn Sie möchten.Einer anderen Warnung: Wenn Sie dies tun, in einem nicht-kartesischen Koordinatensystem keine dieser Methoden anwenden! Erste-Dichte-Schätzungen, die auf einer kugelförmigen Schale ist ein wenig komplizierter.
Sorry für die Verspätung! Grundsätzlich ja, Sie sollten anpassen der Kontur Ebenen zu reflektieren, die Prozentsätze. Die
gaussian_kde
Ergebnisse sind eine Schätzung der wahrscheinlichkeitsdichtefunktion (PDF). Daher Konturierung einen Wert von 0,1 würde bedeuten, dass 90% von die Daten innerhalb der Kontur, etc. Für das 2D-Histogramm die Werte sind Rohdaten, die zählt, so müssten Sie zu normalisieren. Hoffentlich das hilft klären, die Dinge ein bisschen.das ist cool. Aber Wenn ich mir einen 3D-random-Datensatz(x,y,z), dann wird es möglich sein, die Anwendung dieser Methode ?
Ich bin wirklich spät, aber ich bin gespannt, ob du noch einen Beispiel-code, das entspricht in etwa der KDE unscharf.
Haben Sie einen Blick auf die
fast_kde
Funktion hier: gist.github.com/joferkington/d95101a61a02e0ba63e5InformationsquelleAutor Joe Kington
Ich habe die gleiche Frage.
Wenn Sie zeichnen möchten Konturen, die enthalten einen Teil der Punkte, die Sie können verwenden Sie folgenden Algorithmus:
erstellen von 2d-Histogramm
h2 ist nun 2d-matrix mit ganzen zahlen, die Anzahl der Punkte, die in manchen Rechteck
hässlicher hack,
lassen geben für jeden Punkt in h2 2d-matrix die Gesamtzahl der Punkte für das Rechteck enthalten, die Anzahl der Punkte, die gleich oder größer ist, analysieren wir derzeit.
nun Kontur-plot für die h2 -, ist es die Kontur, die mit einem gewissen Menge aller Punkte
InformationsquelleAutor andrey