2016-12-20 2 views
0

Est-il possible d'obtenir les données de polygone (c'est-à-dire les arêtes de triangle) à partir de la fonction plot_trisurf? Puisqu'il prend les données x, y et z et crée une triangulation de Delaunay, il doit avoir ces données quelque part ...?python matplotlib plot_trisurf données de polygone

Quelque chose qui peut être utilisé avec l'exemple ci-dessous serait génial.

from mpl_toolkits.mplot3d import Axes3D 
from matplotlib import cm 
import matplotlib.pyplot as plt 
import numpy as np 

n_angles = 36 

n_radii = 8 

radii = np.linspace(0.125, 1.0, n_radii) 

angles = np.linspace(0, 2*np.pi, n_angles, endpoint=False) 

angles = np.repeat(angles[..., np.newaxis], n_radii, axis=1) 

x = np.append(0, (radii*np.cos(angles)).flatten()) 
y = np.append(0, (radii*np.sin(angles)).flatten()) 


z = np.sin(-x*y) 

fig = plt.figure() 
ax = fig.gca(projection='3d') 

ax.plot_trisurf(x, y, z, cmap=cm.jet, linewidth=0.2) 


plt.show() 

Je voudrais utiliser matplotlib pour cela, car il utilise un algorithme de Delaunay qui est plus adapté aux données 3D. De ce que je peux m'entraîner, je ne le paramétrise pas en 2D, et je suis facilement disponible sur une gamme beaucoup plus large de matériel sans presque autant de faff, contrairement à mayavi. Plotly pourrait aussi être une option, bien que je pense que cela nécessite que les données soient paramétrées en 2D, ce qui n'est pas idéal pour mon application. Je suis conscient qu'il y a des librairies Delaunay dans python scipy qui vont le faire, mais encore une fois le paramétrage des données est le problème.

Répondre

0

Vous pouvez regarder le source code of plot_trisurf pour savoir comment la matplotlib fait la triangulation.
Il effectue essentiellement une triangulation sur une grille 2D et prend en charge la composante z de l'entrée. La triangulation 2D est effectuée par la classe matplotlib.tri.triangulation.Triangulation.

Ce qui suit pourrait faire ce que vous voulez, en vous donnant un tableau des sommets.

from matplotlib.tri.triangulation import Triangulation 
import numpy as np 

n_angles = 36 
n_radii = 8 

radii = np.linspace(0.125, 1.0, n_radii) 
angles = np.linspace(0, 2*np.pi, n_angles, endpoint=False) 
angles = np.repeat(angles[..., np.newaxis], n_radii, axis=1) 

x = np.append(0, (radii*np.cos(angles)).flatten()) 
y = np.append(0, (radii*np.sin(angles)).flatten()) 
z = np.sin(-x*y) 


tri, args, kwargs = Triangulation.get_from_args_and_kwargs(x, y, z) 
triangles = tri.get_masked_triangles() 
xt = tri.x[triangles][..., np.newaxis] 
yt = tri.y[triangles][..., np.newaxis] 
zt = z[triangles][..., np.newaxis] 

verts = np.concatenate((xt, yt, zt), axis=2) 

print verts 
+0

Merci beaucoup d'avoir pris le temps de répondre. –

+0

Impossible de modifier mon propre commentaire, ou répondre aux modifications apportées par d'autres personnes sur mon propre message F'ing .... mais de toute façon. Je n'étais pas au courant de paramétrer plot_trisurf en 2D ... mais ça peut encore fonctionner. Merci encore! –

+0

Pas de problème. N'oubliez pas d'accepter la réponse, une fois qu'elle fonctionne (de sorte qu'elle disparaît de la liste sans réponse) ou de mettre à jour la question si cette réponse ne résout pas votre problème. – ImportanceOfBeingErnest