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

matlab matplotlib plot matlab-figure

2158 观看

2回复

36868 作者的声誉

我正在使用Matplotlib将一些数据绘制为3D表面图。我使用的代码非常类似于这个3D表面绘图示例。它生成如下所示的图:

在此输入图像描述

该图的问题在于Z轴不是垂直的。如何使Z轴垂直?

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

在此输入图像描述

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

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

在此输入图像描述

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

在此输入图像描述

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

作者: Ashwin Nanjappa 的来源 发布者: 2014 年 11 月 7 日

回应 (2)


2

4023 作者的声誉

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

view(3)

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

编辑

具有垂直z轴的问题不是轴是垂直的,而是透视问题。默认情况下,Matlab使用正交投影绘制3D曲面,但matplotlib似乎使用透视投影绘制。可悲的是,matplotlib没有提供用于设置此API的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

我不赞成这个补丁,你可以在这里找到它。

作者: Bentoy13 发布者: 07.11.2014 08:47

0

28 作者的声誉

在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

作者: Michael Green 发布者: 10.05.2019 12:22
32x32