2017-10-20 1 views
0

데이터 세트를 분석 한 다음 xyz 데이터를 출력하는 스크립트가 있습니다. 데이터의 분포를 이해하기 위해이 데이터를 3D 플롯으로 시각화하고 싶습니다. 내가 무슨 일이든하기 matplotlib를 사용에 경험이 없기 때문에, 그냥 here의 코드를 복사하여 다음과 같이 보이는 my text file와 함께 작동하도록 기대 : 나는 스크립트를 시작하면, 나는 다음을 얻을Matplotlib RuntimeWarning 3D 플롯 표시

-0.9 -0.9 483 
-0.9 -0.7 224 
-0.9 -0.5 156 
-0.9 -0.3 153 
-0.9 -0.1 174 
-0.9 0.1 268 
-0.9 0.3 95 
-0.9 0.5 59 
-0.9 0.7 50 
-0.9 0.9 199 
-0.7 -0.9 917 
-0.7 -0.7 244 
-0.7 -0.5 208 
-0.7 -0.3 148 
-0.7 -0.1 139 
-0.7 0.1 98 
-0.7 0.3 52 
-0.7 0.5 56 
-0.7 0.7 60 
-0.7 0.9 221 
... 

그러나 색상 막대가 잘못 표시되는 오류 :

Warning (from warnings module): 
    File "C:\Program Files\Python35\lib\site-packages\matplotlib\colors.py", line 496 
    cbook._putmask(xa, xa < 0.0, -1) 
RuntimeWarning: invalid value encountered in less 

또한 음모에는 가장자리에 이러한 삼각형이 있습니다. 나는 그들이 위에서 언급 한 오류의 결과인지 아닌지 잘 모르겠습니다.

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

fig = plt.figure() 
ax = fig.gca(projection='3d') 

data = np.genfromtxt('plot.txt') 
x = data[:,0] 
y = data[:,1] 
z = data[:,2] 

xi = np.linspace(-1, 1) 
yi = np.linspace(-1, 1) 

X, Y = np.meshgrid(xi, yi) 
Z = griddata(x, y, z, xi, yi, interp='linear') 

surf = ax.plot_surface(X, Y, Z, rstride=5, cstride=5, cmap=cm.jet, 
        linewidth=1, antialiased=True) 

ax.set_zlim3d(np.min(Z), np.max(Z)) 

fig.colorbar(surf) 

plt.show() 

편집 : 1 : 여기 enter image description here

내 코드입니다 : 내가 출력 잘못된 라인, 전 XA 인쇄 할 수있는 소스 코드 편집 :

을 이것은 출력
[ nan nan nan nan nan nan nan nan nan nan nan 256. 
256. 256. 256. 256. 256. 256. 256. nan nan 256. 256. 256. 
256. 256. 256. 256. 256. nan nan 256. 256. 256. 256. 256. 
256. 256. 256. nan nan 256. 256. 256. 256. 256. 256. 256. 
256. nan nan 256. 256. 256. 256. 256. 256. 256. 256. nan 
nan 256. 256. 256. 256. 256. 256. 256. 256. nan nan 256. 
256. 256. 256. 256. 256. 256. 256. nan nan 256. 256. 256. 
256. 256. 256. 256. 256. nan nan nan nan nan nan nan 
nan nan nan nan] 

여기 NaN 값이 분명히 있지만 분명히 어디에서 왔는지 모르겠습니다. .

+0

이것은 따라서 플롯을받을 수 있나요 경고가 아닌 오류입니다. 문제의 [mcve]가 없으면 어떤 일이 진행되는지 알기가 정말 어렵습니다. 즉, 귀하의 데이터가 없습니다. 문제를 재현하기 위해 코드 내에 일부 데이터를 생성하는 것이 가장 좋습니다. – ImportanceOfBeingErnest

+0

소스 코드로 가서 문제의 라인 앞에'print (xa)'를 넣으면, 배열에 나노 값이 포함되어있는 것을 볼 수 있습니다. 그 이유는'Z'에 나노 값이 포함되어 있기 때문입니다. – Reti43

+0

@ImportanceOfBeingErnest 빠른 응답을하고 내 게시물을 편집 해 주셔서 감사합니다. 나는 나의 자료를 당신에게 제공했다. [위의 링크] (https://pastebin.com/raw/UsQ5eArF)에는 내가 가지고있는 모든 xyz 좌표가 포함되어 있습니다. – TheJD

답변

1

문제는 griddata이 모서리의 가장자리에 대한 데이터를 생성 할 수 없다는 것입니다. 이것은 출력 배열을 마스킹하여 내부적으로 회피됩니다. 그러나 마스크 된 배열의 경우 색상을 결정하는 데 필요한 xa < 0이라는 비교는 불가능합니다.

여기 해결책은 가장자리를 플로팅에서 제외하는 것입니다.

ax.plot_surface(X[1:-1,1:-1], Y[1:-1,1:-1], Z[1:-1,1:-1]) 

완벽한 예 :

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

fig = plt.figure() 
ax = fig.gca(projection='3d') 

data = np.genfromtxt('plot.txt') 
x = data[:,0] 
y = data[:,1] 
z = data[:,2] 

xi = np.linspace(-1, 1) 
yi = np.linspace(-1, 1) 

X, Y = np.meshgrid(xi, yi) 
Z = griddata(x, y, z, xi, yi, interp='linear') 

surf = ax.plot_surface(X[1:-1,1:-1], Y[1:-1,1:-1], Z[1:-1,1:-1], 
         rstride=5, cstride=5, cmap=cm.jet, 
         linewidth=1, antialiased=True) 

ax.set_zlim3d(np.min(Z), np.max(Z)) 

fig.colorbar(surf) 

plt.show() 

enter image description here

+1

'griddata'가 범위 밖의 데이터에 마스크 된 배열을 생성하는 동안,'plot_surface'는 아직 그것을 지원하지 않습니다. 이 함수는'site-packages \ mpl_toolkits \ mplot3d \ axes3d.py' 파일에 있으며,이 기능을 지원하기위한 할일 메모가 있습니다. 현재 그들은 단지'X, Y, Z = np.broadcast (X, Y, Z)'를 수행하는데, 이것은 마스킹을 파괴하고 여러분의 nan 값이 드러납니다. – Reti43