我需要在matplotlib中创建一个3D图。我正在从格式化为1D数组的文本文件中读取Z值。此数据表示50x50平方的每个点的值。因此前50个值用于点(0,0),(1,0)..(49,0),接下来的50用于(0,1),(1,1)等等。到目前为止,我已经编写了以下代码:
import matplotlib.pyplot as plt
import numpy as np
fp=open(path,"r")
a=fp.read()
buffer=""
data=[]
for i in a:
if i != ' ':
buffer=buffer+i
else:
data.append(float(buffer))
buffer=""
fp.close()
values=data[50*50:50*50*2]
x=np.linspace(0,50,50)
y=np.linspace(0,50,50)
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.plot_trisurf(x, y, values)
plt.show()
但当然不行。我在互联网上搜索了一些线索但没有任何成功。有人能告诉我应该怎么做吗?我会非常感激。
答案 0 :(得分:1)
首先,您忘记导入Axes3D:import matplotlib.pyplot as plt
。
其次,您的代码具有奇怪的无意义行:values[50*50*nb:50*50*(nb+1)]
并且代码中的缩进错误。
第三,要定期绘制网格化数据,不需要plot_trisurf,请使用plot_surface:
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
x=np.linspace(0,50,50)
y=np.linspace(0,50,50)
X, Y = np.meshgrid(x, y)
values = np.sqrt(X**2 + Y**2)
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.plot_surface(x, y, values)
plt.show()
查看示例:http://matplotlib.org/examples/mplot3d/surface3d_demo.html