我正在尝试通过youtube上的教程来学习Python,而且我在使用3D图表时遇到了一些困难。长话短说,我不断得到(如果
Z.ndim != 2:
AttributeError: 'list' object has no attribute 'ndim')
尝试启动这个简单程序时出现错误:
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
fig = plt.figure()
chart = fig.add_subplot(1,1,1,projection = '3d')
X,Y,Z = [1,2,3,4,5,6,7,8],[2,5,3,8,9,5,6,1],[3,6,2,7,5,4,5,6]
chart.plot_wireframe(X,Y,Z)
plt.show()
我知道它与Axes3.plot_wireframe()
方法有关,但任何人都可以向我解释发生了什么。
答案 0 :(得分:1)
我遇到了确切的问题(例如,视频虽然完全没有复制,但仍未正常工作)。在没有查看源代码的情况下,我假设在matplotlib 2.1.0中添加了一个现实检查,NOW阻止在plot_wireframe中使用1D数组。将该方法调用更改为" plot"确实解决了这个问题。
答案 1 :(得分:1)
命令
ax.plot_wireframe(x,y,z, rstride=2, cstride=2)
正在创建最新版本的问题。
尝试使用:
ax.plot(x,y,z)
这肯定会解决您的问题。 众所周知,Python与旧库不一致。 我得到这个图像作为输出: This is the 3d Image I am getting
答案 2 :(得分:1)
我通过做两件事解决了这个问题。
#My 3d graph
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
import numpy as np
figure = plt.figure()
axis = figure.add_subplot(111, projection = '3d')
x = [1,2,3,4,5,6,7,8,9,10]
y = [5,6,7,8,2,5,6,3,7,2]
z = np.array([[1,2,6,3,2,7,3,3,7,2],[1,2,6,3,2,7,3,3,7,2]])
axis.plot_wireframe(x, y, z)
axis.set_xlabel('x-axis')
axis.set_ylabel('y-axis')
axis.set_zlabel('z-axis')
plt.show()
特别注意z变量。如果z不是多维,则会引发错误。
希望它可以解决您的问题
答案 3 :(得分:0)
使用Python 2.7.10或Python 3.6.0运行代码,使用matplotlib版本2.0.2,生成相同的图像,没有错误:
这不是线框,而简单的ax.plot(X, Y, Z)
会产生它。正如DavidG和ImportanceOfBeingErnest巧妙地提到的那样,将1D列表传递给线框函数是没有意义的,因为X,Y和Z应该是二维的。
以下代码(来自matplotlib官方文档的示例)准确显示了plot_wireframe
函数的参数应该是什么(使用numpy
数组):
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
import numpy as np
'''
def get_test_data(delta=0.05):
from matplotlib.mlab import bivariate_normal
x = y = np.arange(-3.0, 3.0, delta)
X, Y = np.meshgrid(x, y)
Z1 = bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
Z2 = bivariate_normal(X, Y, 1.5, 0.5, 1, 1)
Z = Z2 - Z1
X = X * 10
Y = Y * 10
Z = Z * 500
return X, Y, Z
'''
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
x, y, z = axes3d.get_test_data(0.05)
ax.plot_wireframe(x,y,z, rstride=2, cstride=2)
plt.show()
输出图像是真正的线框:
例如,打印x.shape
会产生(120,120),表明阵列是二维的,第一维有120个位置,第二维有120个位置。