2017-10-20 106 views
0

我有一個腳本,它分析數據集,然後輸出xyz數據。爲了理解數據的分佈,我想在三維圖中將其可視化。由於我沒有經驗什麼那麼使用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 

此外,該圖的邊緣上有這些三角形。我不確定他們是否也是上述錯誤的後果。 這是輸出: enter image description here

這是我的代碼:

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() 

EDIT 1: 我編輯的源代碼以打印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

這是一個警告,而不是一個錯誤,所以你得到一個情節了。如果沒有問題,真的很難知道發生了什麼,即我們沒有您的數據。最好嘗試在代碼中生成一些數據來重現問題。 – ImportanceOfBeingErnest

+0

如果你轉到源代碼並將'print(xa)'放在違規行之前,你會看到該數組包含nan值,這是因爲你的'Z'包含nan值。 – 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'中,它們有一個todo註釋來支持這個。目前他們只是做'X,Y,Z = np.broadcast(X,Y,Z)',它會破壞任何掩碼,並且你的nan值被暴露。 – Reti43