2017-01-31 10 views
2

Я хотел бы сделать 3D-график в matplotlib. У меня 6 точек с координатами x, y и z. Я график их, и я получил это:заполненный 3d участок python

3D Plot without filling

Но моя цель участок, где поверхность между синими линиями будет цвет заполнены.

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

plt.rcParams['svg.fonttype'] = 'none' # during export plots as .svg files, text is exported as text (default text is exported as curves) 

data = np.loadtxt('D:\PyCharm\File1.txt', skiprows=1) 

x = data[:, 0] 
y = data[:, 1] 
z = data[:, 2]  

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

ax.plot(x, y, z) 

axes = plt.gca() 
axes.set_xlim(5712000, 5716000) 
axes.set_ylim(5576000, 5579000) 
axes.set_zlim(-1000, -600) 
axes.set_xlabel('X') 
axes.set_ylabel('Y') 
axes.set_zlabel('Z') 

plt.tight_layout() 
plt.show() 

И я попробовал три-поверхность участка:

ax.plot_trisurf(x, y, z) 

Но форма не является правильным:

Tri-surface plot

Edit: О моих данных: это текстовый файл, который выглядит следующим образом:

X Y Z 
5714397 5576607 -1008 
5713159 5577871 -999 
5713465 5577909 -1014 
5714156 5577428 -1022 
5714410 5577789 -1035 
5715057 5577407 -1036 
5714397 5576607 -1008 

Вторая и последняя строки одинаковы, но я попытался с другим файлом, в котором я удалил последнюю строку. Сюжеты были такими же, как и выше.

ответ

4

Вы используете plot для рисования вершин. Это дает вам линию, как и ожидалось. Чтобы получить заполненный многоугольник, используйте Poly3DCollection.

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

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

x,y,z = np.loadtxt('D:\PyCharm\File1.txt', skiprows=1, unpack=True) 

verts = [zip(x, y,z)] 
ax.add_collection3d(Poly3DCollection(verts)) 

ax.set_xlim(5712000, 5716000) 
ax.set_ylim(5576000, 5579000) 
ax.set_zlim(-1000, -600) 
plt.show() 
+0

Это работает. Но я использую Python 3, поэтому у меня возникла проблема [Построение 3D-полигонов в Python 3] (http://stackoverflow.com/questions/37585340/plotting-3d-polygons-in-python-3). Теперь все в порядке. –