2017-10-20 138 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