Python Matplotlib运行时警告显示三维打印

Python Matplotlib运行时警告显示三维打印,python,python-3.x,matplotlib,Python,Python 3.x,Matplotlib,我有一个脚本,它分析数据集,然后输出xyz数据。为了理解数据的分布,我想在3d绘图中可视化它。由于我没有使用matplotlib的经验,所以我只是从中复制了代码,并希望它能够使用,如下所示: -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.

我有一个脚本,它分析数据集,然后输出xyz数据。为了理解数据的分布,我想在3d绘图中可视化它。由于我没有使用matplotlib的经验,所以我只是从中复制了代码,并希望它能够使用,如下所示:

-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
编辑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值,但我不确定它们来自何处。

问题是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()

这是一个警告,而不是一个错误,因此您确实得到了一个绘图。如果没有对问题的详细了解,就很难知道发生了什么,也就是说,我们没有您的数据。最好在代码中生成一些数据来重现问题。如果您转到源代码并将printxa放在有问题的行之前,您将看到数组包含nan值,这是因为您的Z包含nan值。@ImportantanceOfBeingernest感谢您的快速响应和编辑我的帖子。我确实向你提供了我的数据。包含我所有的xyz坐标。@43谢谢你的提示。我相应地编辑了我的问题!虽然griddata为超出范围的数据生成屏蔽数组,但plot_surface尚不支持该功能。该功能位于文件站点packages\mpl_toolkits\mplot3d\axes3d.py中,它们有支持此功能的待办事项说明。现在他们只做X,Y,Z=np.X,Y,Z,这会破坏任何掩蔽,你的nan值也会暴露出来。
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()