我有一个文件myfile.mat从octave导出,它包含三个矩阵X,Y,U它们都有相同的大小我想绘制表面U,其中X,Y是表面U的x和y分量。我可以使用以下代码以八度音程完成:
surf(X,Y,U)
但我也想在python中做到这一点。我正在使用pythonxy并首先在python中绘制数据我在spyder中看到变量资源管理器中的矩阵之后,我用spyder GUI以交互方式导入数据我实现了以下代码
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
from matplotlib import cm
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.plot_surface(X, Y, U, rstride=8, cstride=8, alpha=0.3)
但我看到一个空白的数字窗口。 这是数据myfile.mat
答案 0 :(得分:1)
我怀疑你忘记在最后加入plt.show()
的电话。此函数在MATLAB / Octave中没有模拟,但在matplotlib中绝对需要。此外,请注意plt.show()
似乎在某些Python环境中的循环内部无法正常工作,因此如果您尝试一次生成多个图像(例如,在“for”中生成10个不同的图形“循环”也可能是一个隐藏的问题来源。此外,您需要在调用cmap=cm.<whatever>
方法时使用ax.plot_surface()
选项定义色彩映射。可以找到您可以使用的所有色彩映射列表here。最后,您的步幅对于您包含的微小数据文件来说太大了。我在下面添加了示例代码和结果图。我没有设置alpha=0.3
,因为这些数据没有必要(在其他任何地方之前或之后没有任何内容),但如果你愿意,你可以把它放回去;代码仍然有效。
import scipy.io
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
data = scipy.io.loadmat('myfile.mat')
X = data['X']
Y = data['Y']
U = data['U']
fig = plt.figure()
ax = fig.gca(projection='3d')
surf = ax.plot_surface(X, Y, U, rstride=1, cstride=1, cmap=cm.jet)
fig.colorbar(surf)
plt.show()