2012-09-14 19 views
14

mam dużo (289) 3D punktów ze współrzędnych xyz która wygląda następująco:Najprostszy sposób wykreślić 3d powierzchnię danego 3d punkty

3D points

Z kreślenia po prostu 3D Space z punktów jest OK, ale ja mają kłopoty z powierzchni Istnieją pewne punkty:

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 

nie ma równe X. i wartości Y w. X wynosi od -0,8 do 0,8, Y wynosi od -0,9 do 0,9, a z od 0 do 111.

Jeśli to możliwe, w jaki sposób wykonać powierzchnię 3D za pomocą tych punktów?

+1

Oto kolejny przykład: http://stackoverflow.com/a/30539444/3585557. Ponadto, zajrzyj do tych powiązanych/podobnych/duplikatów postów: 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. –

Odpowiedz

13

Proszę spojrzeć na Axes3D.plot_surface lub na inne metody Axes3D. Możesz znaleźć przykłady i inspiracje here, here lub here.

Edit:

Z danych, które nie są regularnie X-Y-siatki (równych odległościach między punktami siatki w jednym wymiarze) nie jest trywialne wykreślić jako triangulated powierzchni. Dla danego zestawu nieregularnych (X, Y) współrzędnych istnieje wiele możliwych triangulacji. Jedna triangulacja może być obliczona za pomocą algorytmu Delaunaya "najbliższego sąsiada". Można to zrobić w matplotlib. Jednak nadal jest nieco uciążliwe:

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

Wygląda na to wsparcie zostanie poprawiona:

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

Z pomocą http://docs.enthought.com/mayavi/mayavi/auto/example_surface_from_irregular_data.html udało mi się wymyślić bardzo proste rozwiązanie oparte na 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() 

Jest to bardzo prosty przykład oparty na 5 punktach. Cztery z nich są w systemie z poziomu 1:

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

Jednym z nich jest w systemie z poziomu 2:

(0.75, 0.75) 

Algorytm Delaunaya otrzymuje prawo triangulacji oraz powierzchnia jest wyciągana, jak oczekiwano

Result of code above

Pobiegłem powyższy kod w systemie Windows po zainstalowaniu Python(x,y) z poleceniem

ipython -wthread script.py 
+0

Axes34 wymaga punktów powierzchni, które są w tej samej linii. – XuMuK

+0

Najprostszym sposobem na zbudowanie powierzchni jest wykreślenie wielu czworokątów. – XuMuK

19

Rozwiązanie z 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') 

Wynik:

enter image description here

Prawdopodobnie nie bardzo piękne. Ale będzie, jeśli podasz więcej punktów.

0

Robię to z kilkoma liniami w Pythonie używając PANDAS, fabuła jest piękna!

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

Nieco bardziej piękne! W moim przypadku używam colormap JET Colormaps Matplotlib, ale są też inne rodzaje map kolorów i jakości. Spójrz w link przed.