来自.dat文件的3D曲面图

时间:2016-10-13 16:49:38

标签: python matplotlib plot

您好我正在尝试通过从.dat文件绘图来在python中进行3D表面绘图。我遇到了一些麻烦。我终于有一个不会产生任何错误消息的代码,但是即使.dat文件不为空,绘图也不会显示任何内容。我的代码如下。

如何通过3D表面图从.dat文件中绘制数据?我的数据在.dat文件中格式化为三列。谢谢你的帮助!

更新:.dat文件不为空,我可以使用3D散点图绘制相同的.dat文件,但它不适用于此3D曲面图代码。 .dat文件看起来像这样(只有3列数字):

1 2 6
3 8 7
4 9 3
5 2 5


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('file.dat')
x = data[:,0]
y = data[:,1]
z = data[:,2]

xi = np.linspace(min(x), max(x),0.1)
yi = np.linspace(min(y), max(y),0.1)

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

ax.set_xlabel('$x$', fontsize = 14)
ax.set_ylabel('$y$', fontsize = 14)
ax.set_zlabel('$z$', fontsize = 14)
ax.set_title('result..', fontsize = 14)

surf = ax.plot_surface(X, Y, Z, linewidth=1, antialiased=True)

ax.set_zlim3d(0,1)

plt.show()

1 个答案:

答案 0 :(得分:1)

我的猜测是你的问题归结为你用np.linspace做出的一个相当微不足道的错误,当我发表评论时我没有注意到。 np.linspace的第三个参数是数组中的点数,而不是点之间的间距(即np.arange)。

如果我错了,我会在这里展示一个完整的工作示例(从http://matplotlib.org/examples/pylab_examples/griddata_demo.html修改),如果在运行此示例时表面图仍未显示,则可能是您使用matplotlib时遇到的更基本的问题。

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('file.dat')
npts = 1000
x = np.random.uniform(-2, 2, npts)
y = np.random.uniform(-2, 2, npts)
z = x*np.exp(-x**2 - y**2)

xi = np.linspace(min(x), max(x), 100) # <-- note change to 100
yi = np.linspace(min(y), max(y), 100) # <-- note change to 100

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.viridis,
                       linewidth=1, antialiased=True)

ax.set_zlim3d(np.min(Z), np.max(Z))
fig.colorbar(surf)

enter image description here

请注意,使用ax.set_zlim3d(0,1)也可能是一个问题。在您看到数据绘制之前,我不建议您在轴上设置限制。