Si encuentras alguna incompatibilidad con tu código o trabajo, recuerda probar siempre en un ambiente de testing antes añadir el código al trabajo final.
Solución:
El truco es interpolar sobre una cuadrícula antes de trazar; yo usaría scipy
para esto. Debajo R
es un (500,3) array de valores XYZ y V
es la “magnitud” en cada punto XYZ.
from scipy.interpolate import griddata
import numpy as np
# Create some test data, 3D gaussian, 200 points
dx, pts = 2, 100j
N = 500
R = np.random.random((N,3))*2*dx - dx
V = np.exp(-( (R**2).sum(axis=1)) )
# Create the grid to interpolate on
X,Y,Z = np.mgrid[-dx:dx:pts, -dx:dx:pts, -dx:dx:pts]
# Interpolate the data
F = griddata(R, V, (X,Y,Z))
Desde aquí es muy fácil mostrar nuestros datos:
from mayavi.mlab import *
contour3d(F,contours=8,opacity=.2 )
Esto da un buen (grumoso) gaussiano.
Eche un vistazo a los documentos de griddata, tenga en cuenta que puede cambiar el método de interpolación. Si tiene más puntos (tanto en la cuadrícula interpolada como en el conjunto de datos), la interpolación mejora y representa mejor la función subyacente que está tratando de ilustrar. Aquí está el ejemplo anterior en 10K puntos y una cuadrícula más fina:
Puede usar el filtro delaunay3d para crear celdas a partir de puntos. Luego puede crear un iso_surface() para la salida UnstructuredGrid de delaunay3d. Si desea ImageData, puede usar el filtro image_data_probe.
import numpy as np
from tvtk.api import tvtk
from mayavi import mlab
points = np.random.normal(0, 1, (1000, 3))
ug = tvtk.UnstructuredGrid(points=points)
ug.point_data.scalars = np.sqrt(np.sum(points**2, axis=1))
ug.point_data.scalars.name = "value"
ds = mlab.pipeline.add_dataset(ug)
delaunay = mlab.pipeline.delaunay3d(ds)
iso = mlab.pipeline.iso_surface(delaunay)
iso.actor.property.opacity = 0.1
iso.contour.number_of_contours = 10
mlab.show()
Te mostramos reseñas y puntuaciones
Si piensas que ha sido útil nuestro artículo, sería de mucha ayuda si lo compartieras con otros juniors de esta forma nos ayudas a extender nuestra información.