2017-08-13 8 views
4

J'ai un fichier de données dans un tableau NumPy, je voudrais voir l'image 3D. Je partage un exemple, où je peux voir l'image 2D de la taille (100, 100), ceci est une tranche dans le plan xy z = 0.Tracer une image 3D à partir d'une donnée dans NumPy-array

import numpy as np 
from matplotlib import pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D 
X, Y, Z = np.mgrid[-10:10:100j, -10:10:100j, -10:10:100j] 
T = np.sin(X*Y*Z)/(X*Y*Z) 
T=T[:,:,0] 
im = plt.imshow(T, cmap='hot') 
plt.colorbar(im, orientation='vertical') 
plt.show() 

Slice at z = 0

Comment puis-je voir un Image 3D des données T de forme (100, 100, 100)?

+1

Votre question semble être similaire à celui-ci: http s: //stackoverflow.com/q/7011428/3272066 – Giorgio

+2

@George Je dirais que cette question est de bien meilleure qualité, et pourrait bénéficier de réponses plus substantielles que celles données sur la question liée. – Mast

+0

Oui, puisque Nachi a fourni des données, il serait intéressant de voir des captures d'écran de différentes approches pour visualiser ces données, que les questions liées n'ont pas – Eric

Répondre

0

Je pense que le problème principal est que vous avez 4 informations pour chaque point, donc vous êtes réellement interessé dans un objet en 4 dimensions. Tracer ceci est toujours difficile (peut-être même impossible). Je suggère l'une des solutions suivantes:

  1. Vous changer la question: Je ne suis pas interessted dans toutes les combinaisons de x, y, z, mais seulement ceux où z = f(x,y)

  2. changement Vous l'exactitude de vous tracer un peu, en disant que vous n'avez pas besoin de 100 niveaux de z, mais seulement peut-être 5, alors vous faites simplement 5 des parcelles que vous avez déjà.

Si vous souhaitez utiliser la première méthode, alors il y a plusieurs sous-méthodes:

A. Tracer la surface 2-dim f(x,y)=z et la couleur avec T B. Utiliser une technique qui est utilisée pour tracer des fonctions complexes, pour plus d'informations, voir here.

La parcelle donnée par la méthode 1.A (qui je pense est la meilleure solution) avec des rendements z=x^2+y^2: enter image description here

J'ai utilisé ce programme:

import numpy as np 
from matplotlib import pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D 
import matplotlib as mpl 
X, Y = np.mgrid[-10:10:100j, -10:10:100j] 
Z = (X**2+Y**2)/10 #definition of f 
T = np.sin(X*Y*Z) 
norm = mpl.colors.Normalize(vmin=np.amin(T), vmax=np.amax(T)) 
T = mpl.cm.hot(T) #change T to colors 
fig = plt.figure() 
ax = fig.gca(projection='3d') 
surf = ax.plot_surface(X, Y, Z, facecolors=T, linewidth=0, 
     cstride = 1, rstride = 1) 
plt.show() 

La deuxième méthode donne quelque chose comme:

enter image description here

Avec le code:

norm = mpl.colors.Normalize(vmin=-1, vmax=1) 
X, Y= np.mgrid[-10:10:101j, -10:10:101j] 
fig = plt.figure() 
ax = fig.gca(projection='3d') 
for i in np.linspace(-1,1,5): 
    Z = np.zeros(X.shape)+i 
    T = np.sin(X*Y*Z) 
    T = mpl.cm.hot(T) 
    ax.plot_surface(X, Y, Z, facecolors=T, linewidth=0, alpha = 0.5, cstride 
     = 10, rstride = 10) 

plt.show() 

Note: J'ai changé la fonction de T = sin(X*Y*Z), car la division par X*Y*Z rend le comportement des fonctions mauvaises, comme vous diviser deux nombres très proche de 0.

+0

Merci pour votre suggestion. La question n'était pas de tracer une surface en quatrième dimension. C'est la visualisation des données en 3D. Les données à chaque point doivent être représentées par une couleur. Cela ne devrait pas non plus être un tracé de contour car le contour représente la collection de courbes de niveau. – Nachi

0

J'ai une solution à ma question. Si nous avons les données NumPy, alors nous pouvons les convertir en TVTK ImageData et ensuite la visualisation est possible avec l'aide de mlab Mayavi.Le code et sa visualisation 3D sont les suivantes

from tvtk.api import tvtk 
import numpy as np 
from mayavi import mlab 
X, Y, Z = np.mgrid[-10:10:100j, -10:10:100j, -10:10:100j] 
data = np.sin(X*Y*Z)/(X*Y*Z) 
i = tvtk.ImageData(spacing=(1, 1, 1), origin=(0, 0, 0)) 
i.point_data.scalars = data.ravel() 
i.point_data.scalars.name = 'scalars' 
i.dimensions = data.shape 
mlab.pipeline.surface(i) 
mlab.colorbar(orientation='vertical') 
mlab.show() 

enter image description here

Pour d'autres données générées au hasard

from numpy import random 
data = random.random((20, 20, 20)) 

La visualisation sera

enter image description here