2012-09-14 55 views
14

Tengo un montón (289) de puntos 3D con coordenadas xyz que se parece a:forma más sencilla de gráficos 3D superficie dada puntos 3d

3D points

Con el trazado de espacio simple 3D con puntos está bien, pero yo tener problemas con la superficie hay algunos puntos:

for i in range(30): 
     output.write(str(X[i])+' '+str(Y[i])+' '+str(Z[i])+'\n') 

-0.807237702464 0.904373229492 111.428744443 
-0.802470821517 0.832159465335 98.572957317 
-0.801052795982 0.744231916692 86.485869328 
-0.802505546206 0.642324228721 75.279804677 
-0.804158144115 0.52882485495 65.112895758 
-0.806418040943 0.405733109371 56.1627277595 
-0.808515314192 0.275100227689 48.508994388 
-0.809879521648 0.139140394575 42.1027499025 
-0.810645106092 -7.48279012695e-06 36.8668106345 
-0.810676720161 -0.139773175337 32.714580273 
-0.811308686707 -0.277276065449 29.5977405865 
-0.812331692291 -0.40975978382 27.6210856615 
-0.816075037319 -0.535615685086 27.2420699235 
-0.823691366944 -0.654350489595 29.1823292975 
-0.836688691603 -0.765630198427 34.2275056775 
-0.854984518665 -0.86845932028 43.029581434 
-0.879261949054 -0.961799684483 55.9594146815 
-0.740499820944 0.901631050387 97.0261463995 
-0.735011699497 0.82881933383 84.971061395 
-0.733021568161 0.740454485354 73.733621269 
-0.732821755233 0.638770044767 63.3815970475 
-0.733876941678 0.525818698874 54.0655910105 
-0.735055978521 0.403303715698 45.90859502 
-0.736448900325 0.273425879041 38.935709456 
-0.737556181137 0.13826504904 33.096106049 
-0.738278724065 -9.73058423274e-06 28.359664343 
-0.738507612286 -0.138781586244 24.627237837 
-0.738539663773 -0.275090412979 21.857410904 
-0.739099040189 -0.406068448513 20.1110519655 
-0.741152200369 -0.529726022182 19.7019157715 

no hay igual X de y los valores de y. X es de -0.8 a 0.8, Y es de -0.9 a 0.9 yz de 0 a 111.

Si es posible, ¿cómo hacer una gráfica de superficie 3D usando estos puntos?

+1

Aquí hay otro ejemplo: http://stackoverflow.com/a/30539444/3585557. Además, eche un vistazo a estas publicaciones relacionadas/similares/duplicadas: http://stackoverflow.com/q/3012783/3585557, http://stackoverflow.com/q/9170838/3585557, http://stackoverflow.com/q/21161884/3585557, http://stackoverflow.com/q/26074542/3585557, http://stackoverflow.com/q/28389606/3585557, http://stackoverflow.com/q/29547687/3585557. –

Respuesta

13

Por favor, eche un vistazo a Axes3D.plot_surface o en el otro Axes3D métodos. Puede encontrar ejemplos e inspiraciones here, here o here.

Editar:

Z-Data que no está en un X-Y-rejilla regular (distancias iguales entre puntos de cuadrícula en una dimensión) no es trivial para trazar como una superficie triangulada. Para un conjunto dado de coordenadas irregulares (X, Y), hay múltiples triangulaciones posibles. Una triangulación se puede calcular a través de un algoritmo de Delaunay del "vecino más cercano". Esto se puede hacer en matplotlib. Sin embargo, todavía es un poco tediosa:

http://matplotlib.1069221.n5.nabble.com/Plotting-3D-Irregularly-Triangulated-Surfaces-An-Example-td9652.html

Parece que el apoyo se mejorará:

http://matplotlib.org/examples/pylab_examples/tripcolor_demo.html http://matplotlib.1069221.n5.nabble.com/Custom-plot-trisurf-triangulations-tt39003.html

Con la ayuda de http://docs.enthought.com/mayavi/mayavi/auto/example_surface_from_irregular_data.html yo era capaz de llegar a una solución muy simple basada en mayavi:

import numpy as np 
from mayavi import mlab 

X = np.array([0, 1, 0, 1, 0.75]) 
Y = np.array([0, 0, 1, 1, 0.75]) 
Z = np.array([1, 1, 1, 1, 2]) 

# Define the points in 3D space 
# including color code based on Z coordinate. 
pts = mlab.points3d(X, Y, Z, Z) 

# Triangulate based on X, Y with Delaunay 2D algorithm. 
# Save resulting triangulation. 
mesh = mlab.pipeline.delaunay2d(pts) 

# Remove the point representation from the plot 
pts.remove() 

# Draw a surface based on the triangulation 
surf = mlab.pipeline.surface(mesh) 

# Simple plot. 
mlab.xlabel("x") 
mlab.ylabel("y") 
mlab.zlabel("z") 
mlab.show() 

Este es un ejemplo muy simple basado en 5 puntos. 4 de ellos están en z de nivel 1:

(0, 0) (0, 1) (1, 0) (1, 1) 

Uno de ellos es en z de nivel 2:

(0.75, 0.75) 

El algoritmo Delaunay obtiene el derecho de triangulación y la superficie se dibuja como se esperaba:

Result of code above

me corrió el código anterior en Windows después de instalar Python(x,y) con el comando

ipython -wthread script.py 
+0

Axes34 requiere puntos de trazado de superficie, que están en las mismas líneas – XuMuK

+0

La forma más sencilla de construir una superficie es trazar una gran cantidad de cuadriláteros. – XuMuK

19

solución con matplotlib:

#!/usr/bin/python3 

import sys 

import matplotlib 
import matplotlib.pyplot as plt 
from matplotlib.ticker import MaxNLocator 
from matplotlib import cm 
from mpl_toolkits.mplot3d import Axes3D 

import numpy 
from numpy.random import randn 
from scipy import array, newaxis 


# ====== 
## data: 

DATA = array([ 
    [-0.807237702464, 0.904373229492, 111.428744443], 
    [-0.802470821517, 0.832159465335, 98.572957317], 
    [-0.801052795982, 0.744231916692, 86.485869328], 
    [-0.802505546206, 0.642324228721, 75.279804677], 
    [-0.804158144115, 0.52882485495, 65.112895758], 
    [-0.806418040943, 0.405733109371, 56.1627277595], 
    [-0.808515314192, 0.275100227689, 48.508994388], 
    [-0.809879521648, 0.139140394575, 42.1027499025], 
    [-0.810645106092, -7.48279012695e-06, 36.8668106345], 
    [-0.810676720161, -0.139773175337, 32.714580273], 
    [-0.811308686707, -0.277276065449, 29.5977405865], 
    [-0.812331692291, -0.40975978382, 27.6210856615], 
    [-0.816075037319, -0.535615685086, 27.2420699235], 
    [-0.823691366944, -0.654350489595, 29.1823292975], 
    [-0.836688691603, -0.765630198427, 34.2275056775], 
    [-0.854984518665, -0.86845932028, 43.029581434], 
    [-0.879261949054, -0.961799684483, 55.9594146815], 
    [-0.740499820944, 0.901631050387, 97.0261463995], 
    [-0.735011699497, 0.82881933383, 84.971061395], 
    [-0.733021568161, 0.740454485354, 73.733621269], 
    [-0.732821755233, 0.638770044767, 63.3815970475], 
    [-0.733876941678, 0.525818698874, 54.0655910105], 
    [-0.735055978521, 0.403303715698, 45.90859502], 
    [-0.736448900325, 0.273425879041, 38.935709456], 
    [-0.737556181137, 0.13826504904, 33.096106049], 
    [-0.738278724065, -9.73058423274e-06, 28.359664343], 
    [-0.738507612286, -0.138781586244, 24.627237837], 
    [-0.738539663773, -0.275090412979, 21.857410904], 
    [-0.739099040189, -0.406068448513, 20.1110519655], 
    [-0.741152200369, -0.529726022182, 19.7019157715], 
]) 

Xs = DATA[:,0] 
Ys = DATA[:,1] 
Zs = DATA[:,2] 


# ====== 
## plot: 

fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 

surf = ax.plot_trisurf(Xs, Ys, Zs, cmap=cm.jet, linewidth=0) 
fig.colorbar(surf) 

ax.xaxis.set_major_locator(MaxNLocator(5)) 
ax.yaxis.set_major_locator(MaxNLocator(6)) 
ax.zaxis.set_major_locator(MaxNLocator(5)) 

fig.tight_layout() 

plt.show() # or: 
# fig.savefig('3D.png') 

Resultado:

enter image description here

Probablemente no muy bonito. Pero lo será, si proporciona más puntos.

0

Hago esto con algunas líneas en python usando PANDAS, la trama es hermosa!

from mpl_toolkits.mplot3d import Axes3D 
import matplotlib.pyplot as plt 
from matplotlib import cm 
import numpy as np 
import pandas as pd 
from sys import argv 

file = argv[1] 

x,y,z = np.loadtxt(file, unpack=True) 
df = pd.DataFrame({'x': x, 'y': y, 'z': z}) 

fig = plt.figure() 
ax = Axes3D(fig) 
surf = ax.plot_trisurf(df.x, df.y, df.z, cmap=cm.jet, linewidth=0.1) 
fig.colorbar(surf, shrink=0.5, aspect=5) 
plt.savefig('teste.pdf') 
plt.show() 

Collapsing wave equations

Un poco más bella! En mi caso utilizo un mapa de color JET Colormaps Matplotlib, pero hay otros tipos de mapas de color y cualitativos. Echa un vistazo en el enlace anterior.

Cuestiones relacionadas