您好我正在尝试通过从.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()
答案 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)
请注意,使用ax.set_zlim3d(0,1)
也可能是一个问题。在您看到数据绘制之前,我不建议您在轴上设置限制。