Axes3D:尝试构建 3D 绘图时出现 Numpy 数组错误

Posted

技术标签:

【中文标题】Axes3D:尝试构建 3D 绘图时出现 Numpy 数组错误【英文标题】:Axes3D: Numpy arrays error while trying to build 3D plot 【发布时间】:2016-08-08 16:52:20 【问题描述】:

让我们从头开始。这就是我获得xy 值的方式:

from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.gca(projection='3d') # get current axis

w0 = np.arange(30, 80, 1) # x - values
w1 = np.arange(-3, 3, 0.1) # y - values

X, Y = np.meshgrid(w0, w1) # no idea why to do that

因为我不知道如何避免循环,所以我用这种方式计算 Z 值:

    sizeWo = len(w0)
    sizeW1 = len(w1)
    Z = np.zeros((sizeWo, sizeW1))

    for i in xrange(0,sizeWo):
        for j in xrange(0,sizeW1):
            Z[i,j] = errorLose(w0[i], w1[j])

surf = ax.plot_surface(X, Y, Z) # that lines generates the error (ValueError: shape mismatch: objects cannot be broadcast to a single shape)

即使这段代码也会产生同样的错误:

surf = ax.plot_surface(w0, w1, Z) shape mismatch: objects cannot be broadcast to a single shape
plt.show()

这里出了什么问题以及如何使它起作用?

errorLose 函数接受两个值并使用后面的数据框data 计算错误:

def errorLose(w0,w1):
    return np.sum((data.Height - (w0 + w1 *data.Weight))**2)

这就是您可以获取相同数据的方式。这是csv file的链接:

data = pd.read_csv('weights_heights.csv', index_col='Index')

【问题讨论】:

【参考方案1】:

你很亲密。问题是您将Z 创建为sizeWo x sizeW1 meshgrid 创建XY 大小为sizeW1 x sizeW0。您可以以不同方式设置Z

Z = np.zeros((sizeW1, sizeWo))

for i in xrange(0,sizeWo):
    for j in xrange(0,sizeW1):
        Z[j,i] = errorLose(w0[i], w1[j])

或者您可以保持Z 不变,只需将Z 的转置传递给您的绘图构造函数

surf = ax.plot_surface(X, Y, np.transpose(Z))

更新

您需要使用meshgrid 的原因是您的x 和y 坐标最初只是一维数组,而plot_surface 期望XY 是二维数组。 meshgrid 所做的是它从两个输入中创建二维数组,其中每两个输入都排列。 This answer 包含对meshgrid 的更详细讨论。

【讨论】:

@Rocketq 抱歉,这是我的错字。现已更新。 哇,这太棒了)但是为什么我们需要meshgrid @Rocketq 我在最后添加了一些讨论,以及指向可能相关答案的链接

以上是关于Axes3D:尝试构建 3D 绘图时出现 Numpy 数组错误的主要内容,如果未能解决你的问题,请参考以下文章

python之画三维图像

尝试使用 matplotlib 绘图时出现奇怪的错误

利用Axes3D绘制三维性能曲面

python-matplotlib AttributeError Axes3D 对象没有属性 set_zticks

尝试在 3D 空间中旋转 2D 形状时出现问题

如何在 PyQt4 小部件中嵌入的 Axes3D (matplotlib) 中启用旋转?