为什么matplotlib在3D图中绘制矩阵的转置?

时间:2017-01-18 21:22:04

标签: python matplotlib

我正在尝试使用matplotlib' smpl_toolkits.mplot3d plot_surface函数绘制3D表面。 我的Z变量(函数f(x,y))非常复杂,一旦我将它们网格化,我就无法将其作为X和Y的函数编写,因此我使用遍历x的循环将其计算为2D数组y变量并将所有内容存储在矩阵中,Z。我将此数组Z传递给plot_surface函数的调用,但是我一直得到错误的绘图,主要是因为我期望Z的数字但得到与Z.transpose相对应的数字

我能够做一个更简单的例子来重现我的问题:

headers.type

Chromium bug report所以,我希望这会产生一个平面,这样当x = 0时,我得到mysol [0,:] = [1,1,1,1,1](我的第一行)矩阵神秘)。相反,如果我查看此代码生成的图形,当x = 0时,我得到矩阵的第一列(mysol [:,0] = [1,2,3,4,5]。

据我所知,如果我绘制mysol.transpose()而不是mysol,问题就解决了,但我试图理解这里的逻辑。那么,为什么matplotlib这样做呢?我希望它能逐行绘制数组,而不是按列绘制。我的错误在哪里?

提前致谢

2 个答案:

答案 0 :(得分:1)

查看meshgrid的结果:

>>> np.meshgrid(range(5), range(5))
[array([[0, 1, 2, 3, 4],
       [0, 1, 2, 3, 4],
       [0, 1, 2, 3, 4],
       [0, 1, 2, 3, 4],
       [0, 1, 2, 3, 4]]),
 array([[0, 0, 0, 0, 0],
       [1, 1, 1, 1, 1],
       [2, 2, 2, 2, 2],
       [3, 3, 3, 3, 3],
       [4, 4, 4, 4, 4]])]

第一个数组是您分配给X的数据,第二个数组是您分配给Y的数据。您可以看到X在列中增加,而Y在行中增加。

所以问题的答案是默认情况下,meshgrid返回XY坐标,而不是行列坐标。如果您在坐标上进行数学运算,通常XY坐标就是您想要的。但是你可以通过传递indexing='ij'参数来制作meshgrid返回矩阵式坐标,如果这就是你想要的那样。

答案 1 :(得分:1)

Matplotlib使用numpy并且与numpy的约定密切相关。

索引numpy数组使a[j,i]为您提供j行和i列中的条目。因此j是垂直坐标,i是水平坐标。识别

horizontal <-> x <-> i  
vertical   <-> y <-> j 

确保任何图像在纸上完全看起来像打印版本的阵列;这使得使用这些2D阵列非常舒服。

这正是您在图片中看到的内容。

enter image description here