des parcelles de surface dans matplotlib
J'ai une liste de 3-n-uplets qui représente un ensemble de points dans l'espace 3D. Je veux tracer une surface qui couvre l'ensemble de ces points. Le plot_surface fonction dans le mplot3d package exige que les arguments X,Y et Z qui sont des tableaux 2d. Est plot_surface le droit de la fonction de tracé de la surface, et comment faire pour transformer mes données dans le format requis ?
data = [(x1,y1,z1),(x2,y2,z2),.....,(xn,yn,zn)]
- Voici quelques connexes/similaire/messages en double: stackoverflow.com/q/3012783/3585557, stackoverflow.com/q/12423601/3585557, stackoverflow.com/q/21161884/3585557, stackoverflow.com/q/26074542/3585557, stackoverflow.com/q/28389606/3585557, stackoverflow.com/q/29547687/3585557.
Vous devez vous connecter pour publier un commentaire.
Pour les surfaces c'est un peu différente de celle d'une liste de 3-n-uplets, vous devez passer dans une grille pour le domaine en 2d tableaux.
Si tout ce que vous avez une liste de points 3d, plutôt que d'une fonction
f(x, y) -> z
, alors vous aurez un problème, car il existe de multiples façons de trianguler que la 3d du nuage de points sur une surface.Voici une surface lisse exemple:
f(x,y) -> z
vous obtient plus d'informations que de simplement en utilisant une approche par liste comme l'OP avait initialement.plot_trisurf
à la place. Mais comme je l'ai mentionné, il est non-trivial parce que vous avez besoin pour effectuer une triangulation de la surface et il y a plusieurs solutions. Comme un exemple de base, tenir compte des 4 points donnés par (0, 0, 0.2), (0, 1, 0), (1, 1, 0.2), (1, 0, 0). Vu de dessus, il ressemble à un carré avec un léger pli en elle. Mais le long de la diagonale qui ne le "pli" de se produire? Est-ce le "haut" de diagonale à 0,2 ou le "bas" de diagonale à 0? Les deux sont valables surfaces! Si vous avez besoin de choisir un algorithme de triangulation avant vous avez une solution bien définis.projection='3d'
dans l'appelfig.add_subplot
sera indisponible sans cette importation.Vous pouvez lire les données directement à partir d'un fichier et de l'intrigue
Si nécessaire, vous pouvez passer vmin et vmax pour définir la barre de couleur, par ex.
Section Bonus
Je me demandais comment faire certaines interactive des parcelles, dans ce cas avec des données
Je viens de tomber sur ce même problème. J'ai également espacés à des données en 3 1-D des tableaux au lieu de la 2-D des matrices de
matplotlib
'splot_surface
veut. Mes données qui est arrivé à être dans unpandas.DataFrame
voici donc lamatplotlib.plot_surface
exemple avec les modifications de la parcelle 3 1-D les tableaux.Qui est à l'origine d'exemple. Ajouter ce bit suivant crée sur la même parcelle de 3 tableaux 1d.
Ici sont les chiffres qui en résultent:
griddata()
est la fonction qui interpole les dispersés x,y,z triplets sur le régulier x,y de la grille. Si vous voulez ot de couleur catégories séparément, regarder dans laplot_surface(facecolor=...)
argument.'linewidth'
définit la largeur des lignes entre les voxels (0 élimine les lignes), et'antialiased'
contrôle la couleur de transition entre voxel limites.vérifier le fonctionnaire exemple.
X,Y et Z sont en effet 2d tableaux numpy.meshgrid() est un moyen simple d'obtenir 2d (x,y maillage de 1d x et y les valeurs.
http://matplotlib.sourceforge.net/mpl_examples/mplot3d/surface3d_demo.py
voici pythonic moyen de convertir votre 3-n-uplets de 3 tableaux 1d.
Voici mtaplotlib de la triangulation de delaunay (interpolation), il convertit les 1d x,y,z en quelque chose de conforme (?):
http://matplotlib.sourceforge.net/api/mlab_api.html#matplotlib.mlab.griddata
Juste à carillon, Emanuel a eu la réponse que j'ai (et probablement beaucoup d'autres) sont à la recherche pour. Si vous avez 3d des données éparses dans les 3 tableaux distincts, les pandas est une aide incroyable et fonctionne beaucoup mieux que les autres options. D'élaborer, supposons que x,y,z sont certains arbitraire de variables. Dans mon cas, elles ont été c,gamma, et des erreurs parce que j'ai été le tester une machine à vecteurs de support. Il y a beaucoup de choix potentiels de tracer les données:
Filaire parcelle de données
3d de la dispersion des données
Le code ressemble à ceci:
Voici le résultat final:
Dans Matlab j'ai fait quelque chose de similaire à l'aide de la
delaunay
fonction de lax
,y
coords seulement (pas laz
), puis tracer avectrimesh
outrisurf
, à l'aide dez
que la hauteur.SciPy a la Delaunay classe, qui est basé sur le même sous-jacent QHull bibliothèque de l'Matlab
delaunay
fonction, alors vous devriez obtenir des résultats identiques.À partir de là, il convient de quelques lignes de code pour convertir cette Traçant les Polygones 3D en python-matplotlib exemple dans ce que vous souhaitez obtenir, comme
Delaunay
vous donne la spécification de chaque triangulaire polygone.ax.plot_trisurf(..)
.Il n'est pas possible de le faire directement une surface 3d à l'aide de vos données. Je vous recommande de construire un modèle d'interpolation à l'aide de certains outils comme pykridge. Le processus comprend trois étapes:
pykridge
X
etY
à l'aide demeshgrid
Z
Avoir créé votre grille et le correspondant
Z
valeurs, vous êtes maintenant prêt à aller avecplot_surface
. A noter que selon la taille de vos données, lameshgrid
fonction peut fonctionner pendant un certain temps. La solution de contournement consiste à créer régulièrement espacés échantillons à l'aide d'np.linspace
pourX
etY
axes, puis appliquer l'interpolation pour en déduire la nécessaireZ
valeurs. Si oui, les valeurs interpolées pourrait différent de l'originalZ
parce queX
etY
ont changé.