2017-10-02 22 views
0

데이터 포인트가 와이어 프레임으로 그려지는 matplotlib 용 스크립트를 작성하려고합니다. 한 번 gnuplot에서 그렇게했습니다 (현재 작동 중입니다). 그럼에도 불구하고 필자는 필자가 스크립트의 일부를 matplotlib로 옮기고있다.플롯 와이어 프레임의 데이터가 작동하지 않음

일부 데이터는 원통형 좌표로 계산되었습니다. 고정 된 z 's를 위해 나는 phi 각에 따라 x와 y 좌표를 계산했습니다. 완전한 원을 그릴 때, 다음 단계 Z-등 calculcated되는 데이터 lowrank.net/gnuplot/ (공백 라인은 여기에 설명 된 와이어를 플롯의 gnuplot을 얻는 데 필요한이

6.71570E+01 0.00000E+00 6.00000E+01 4.46028E+01 
    6.70761E+01 3.29524E+00 6.00000E+01 4.46028E+01 
    6.68336E+01 6.58254E+00 6.00000E+01 4.46028E+01 
    6.64301E+01 9.85398E+00 6.00000E+01 4.46028E+01 
    6.58666E+01 1.31017E+01 6.00000E+01 4.46028E+01 
    6.51444E+01 1.63178E+01 6.00000E+01 4.46028E+01 
    6.42653E+01 1.94947E+01 6.00000E+01 4.46028E+01 
    6.32313E+01 2.26245E+01 6.00000E+01 4.46028E+01 
    [...] 
    6.68336E+01 -6.58254E+00 6.00000E+01 4.46028E+01 
    6.70761E+01 -3.29524E+00 6.00000E+01 4.46028E+01 
    6.71570E+01 -8.51512E-13 6.00000E+01 4.46028E+01 

    6.34799E+01 0.00000E+00 5.70000E+01 4.21513E+01 
    6.34035E+01 3.11481E+00 5.70000E+01 4.21513E+01 
    6.31742E+01 6.22212E+00 5.70000E+01 4.21513E+01 
    6.27928E+01 9.31444E+00 5.70000E+01 4.21513E+01 
    6.22602E+01 1.23843E+01 5.70000E+01 4.21513E+01 
    6.15775E+01 1.54244E+01 5.70000E+01 4.21513E+01 
    6.07465E+01 1.84272E+01 5.70000E+01 4.21513E+01 
    5.97691E+01 2.13857E+01 5.70000E+01 4.21513E+01 
    5.86478E+01 2.42927E+01 5.70000E+01 4.21513E+01 
    5.73852E+01 2.71412E+01 5.70000E+01 4.21513E+01 
    5.59843E+01 2.99242E+01 5.70000E+01 4.21513E+01 
    5.44485E+01 3.26352E+01 5.70000E+01 4.21513E+01 
    5.27816E+01 3.52676E+01 5.70000E+01 4.21513E+01 
    [...] 

같다 datafile-e.html, '3 차원 데이터'참조). 단순히 gnuplot에서 'splot'을 호출하면 데이터의 정확한 와이어 프레임이 그려집니다.

GnuPlot plot of my wireframe

때 다음 코드로하기 matplotlib에서 플롯하려고 : 그것은 단지 고정 된 Z 좌표에 원을 그립니다

import matplotlib.pyplot as plt 
import numpy as np 

from mpl_toolkits.mplot3d import Axes3D 

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

file_in = open('wireframe_data.dat') 
with file_in as file: 
    data_mani = [[np.double(digit) for digit in line.split()] for line in file] 
file_in.close() 

data_mani = list(filter(None, data_mani)) # remove blank lines, fastest way 
data_mani = np.array(data_mani, dtype='float64') 

ax.plot_wireframe(data_mani[:, 0], data_mani[:, 1], data_mani[:, 2], rcount = 10, ccount = 10, linewidth=0.7) 

및 z 방향의 원을 따라 라인, 즉, 완전한 와이어 프레임이 아닙니다. 이

Matplotlib plot of my wireframe (different data, but same structure)

같은 결과 loooks 나는 파이썬에서 올바르게 플롯하는 방법을 알아 내려고 노력하고있어 나는 다른 meshgrid 부름 작업을 얻을 수 없습니다. 현재 표면 데이터가 이미 존재하기 때문에 meshgrid가 필요한지조차 확신 할 수 없습니다. 어쩌면 누군가가 아이디어를 가지고 나를 도울 수 있을까요? 나는 그 순간 정말로 좌절하고있다.

답변을 기다리십시오.

행복을 빌며,

답변

1

확인 TheOrangeman, 나는 해결책을 발견했다. 내 데이터를 다음과 같이 바꿔야했습니다.

[...] 
num_z = len(np.unique(data_mani[:, 2])) 
points_per_z = len(data_mani)/num_z 

XX = np.reshape(data_mani[:, 0], (num_z, points_per_z)) 
YY = np.reshape(data_mani[:, 1], (num_z, points_per_z)) 
ZZ = np.reshape(data_mani[:, 2], (num_z, points_per_z)) 

ax.plot_wireframe(XX, YY, ZZ) 

이제 this처럼 보입니다.