Nuage De Points Des Contours Dans Matplotlib
J'ai un énorme nuage de points (~100 000 points) que je suis de la génération de matplotlib. Chaque point a à un lieu dans cet espace x/y, et je voudrais générer des contours contenant certains percentiles du nombre total de points.
Est-il une fonction dans matplotlib qui va le faire? J'ai regardé dans le contour(), mais j'aurais du écrire mon propre fonction pour travailler dans ce sens.
Merci!
OriginalL'auteur astromax | 2013-10-15
Vous devez vous connecter pour publier un commentaire.
Fondamentalement, vous êtes désireux d'une estimation de la densité de la sorte. Il ya plusieurs façons de le faire:
Utiliser un histogramme 2D quelconque (par exemple
matplotlib.pyplot.hist2d
oumatplotlib.pyplot.hexbin
) (Vous pouvez aussi afficher les résultats comme des contours--utilisationnumpy.histogram2d
et puis le contour de la matrice résultante.)Faire un noyau de densité estimation (KDE) et le contour des résultats. KDE est essentiellement lissage de l'histogramme. Au lieu d'un point de tomber dans un bac, il ajoute un poids environnant les bacs (généralement sous la forme d'une gaussienne "courbe en cloche").
À l'aide d'un histogramme 2D est simple et facile à comprendre, mais fundementally donne "polyédrique" des résultats.
Il y a quelques rides à faire de la seconde une "correctement" (c'est à dire il n'y a pas une seule bonne manière). Je n'entrerai pas dans les détails ici, mais si vous voulez interpréter les résultats statistiquement, vous avez besoin de la lire (en particulier la sélection de la bande passante).
En tout cas, voici un exemple des différences. Je vais intrigue de chacun de la même façon, je ne les utilise pas les contours, mais vous pouvez tout aussi facilement tracer l'histogramme 2D ou gaussien KDE à l'aide d'un tracé de contour:
Une mise en garde: un très grand nombre de points,
scipy.stats.gaussian_kde
va devenir très lent. Il est assez facile de l'accélérer en faisant une approximation--il suffit de prendre l'histogramme 2D et flou avec un guassian filtre de bon rayon et de la covariance. Je peux donner un exemple si vous le souhaitez.Une autre mise en garde: Si vous ne le faites dans un non-système de coordonnées cartésiennes, aucune de ces méthodes ne s'appliquent! Obtenir des estimations de la densité sur une coquille est un peu plus compliqué.
Désolé pour le retard!! En gros, oui, vous devez ajuster le contour des niveaux afin de refléter les pourcentages. Le
gaussian_kde
résultats sont une estimation de la fonction de densité de probabilité (PDF). Par conséquent, les contours d'une valeur de 0,1 impliquerait que 90% des données est à l'intérieur du contour, etc. Pour le 2D de l'histogramme, les valeurs sont comptages bruts, de sorte que vous aurez besoin de normaliser. J'espère que ça permet de clarifier un peu les choses.c'est cool. Mais Si j'ai un 3D de hasard-jeu de données(x,y,z), alors qu'il sera possible d'appliquer cette méthode ?
Je suis vraiment en retard, mais je suis curieux de savoir si vous avez encore un exemple de code qui se rapproche de l'KDE en utilisant un effet de flou.
Jetez un oeil à la
fast_kde
fonction ici: gist.github.com/joferkington/d95101a61a02e0ba63e5OriginalL'auteur Joe Kington
J'ai la même question.
Si vous voulez tracer les contours, qui contiennent une partie des points que vous pouvez utiliser l'algorithme suivant:
créer 2d histogramme
h2 est maintenant matrice 2d contenant des entiers qui est le nombre de points dans certains rectangle
moche hack,
laissez donner pour chaque point dans h2 matrice 2d, le nombre cumulé de points pour le rectangle qui contient nombre de points égal ou supérieur à celui que nous analysons actuellement.
maintenant tracer le contour de h2, il sera le contour contenant une certaine quantité de tous les points
OriginalL'auteur andrey