如何在Matplotlib的3D曲面图中获得垂直Z轴?

时间:2014-11-07 08:22:16

标签: matlab matplotlib plot matlab-figure

我正在使用Matplotlib将一些数据绘制为3D表面图。我使用的代码与此3D surface plot example非常相似。它生成如下所示的图:

enter image description here

此图的问题是Z轴不是垂直的。如何使Z轴垂直?

我检查了可用的不同API并找到了view_init。通过使用elev=1设置绘图的低高程(view_init),我可以将Z轴设置为垂直,如下所示:

enter image description here

但是,这里的问题是在低海拔时,Y轴刻度标签都被覆盖,无法正确查看。所以我需要绘图处于高海拔并且X-Y平面旋转角度如图1所示。如何为此绘图实现垂直Z轴?

我不知道Matlab,但我知道Matplotlib源自Matlab API。因此,我查看了Matlab文档中的曲面图示例,发现Z轴在它们的示例中似乎是垂直的。下图显示了一个高海拔图示:

enter image description here

更新1:根据Bentoy13的建议,我设置view_init(elev=30, azim=-37.5)并获得以下结果。它更好,但还不是垂直的:

enter image description here

相比之下,Matlab图中的Z轴是完全垂直的。此外,从这个角度可以看出,我实际上无法使用此azim=-37.5,因为隐藏了一些信息。还有其他方法吗? : - )

2 个答案:

答案 0 :(得分:2)

在Matlab文档中给出的示例中,表面图通常在特殊位置查看,该位置由命令view给出:

view(3)

命令view设置轴的视点。根据文档,view(3)设置默认的三维视图,方位角= -37.5,高程= 30。

修改

具有垂直z轴的问题不是轴是垂直的,而是透视问题。默认情况下,Matlab使用正交投影绘制3D曲面,但matplotlib似乎使用透视投影绘制。遗憾的是,matplotlib没有提供用于设置此...的API ...

编辑2

以下补丁似乎对于在正投影中绘制3D非常有用:

import numpy
from mpl_toolkits.mplot3d import proj3d
def orthogonal_proj(zfront, zback):
    a = (zfront+zback)/(zfront-zback)
    b = -2*(zfront*zback)/(zfront-zback)
    return numpy.array([[1,0,0,0],
                        [0,1,0,0],
                        [0,0,a,b],
                        [0,0,0,zback]])
proj3d.persp_transformation = orthogonal_proj

我不赞成这个补丁,你可以找到它here

答案 1 :(得分:0)

在MPL 2.1.0 1中,他们添加了手动覆盖投影的选项,以生成具有正交投影的3d图形。只需在脚本中插入以下行即可:

ax.set_proj_type('ortho')

[来自MPL来源1的示例]

1 https://matplotlib.org/users/prev_whats_new/whats_new_2.1.0.html