【问题标题】:How to get vertical Z axis in 3D surface plot of Matplotlib?如何在 Matplotlib 的 3D 曲面图中获得垂直 Z 轴?
【发布时间】:2023-04-06 09:17:01
【问题描述】:

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

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

我检查了可用的不同 API,发现 view_init。通过使用view_init设置绘图的低仰角(elev=1),我可以使Z轴垂直,如下所示:

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

我不知道 Matlab,但我知道 Matplotlib 是从 Matlab API 派生的。因此,我查看了 Matlab 文档中的曲面图示例,发现 Z 轴在他们的示例中似乎是垂直的。下图为高海拔示意图:

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

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

【问题讨论】:

  • 看起来像透视投影/正射投影问题

标签: matlab matplotlib plot matlab-figure


【解决方案1】:

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

ax.set_proj_type('ortho')

[来自 MPL 源 1 的示例]

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

【讨论】:

    【解决方案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

    【讨论】:

    • 谢谢!我尝试了这些设置,Z 轴更好,几乎是垂直的。我已经用新数字更新了这个问题。有什么方法可以让它完全垂直,就像在 Matlab 图中一样?另外,我不能将这个 azim 用于这些数据 :-)
    • @Ashwin 看到我的编辑。我找到了一段代码可以转为正交投影here,但是我对matplotlib不熟悉,所以我不知道你绘制了曲面图后如何使用它。
    • Bentoy13:成功了!您可以重新发布该代码 sn-p 作为答案,以便我接受吗? :-)
    • 从 2.1 版开始,此功能已实现:matplotlib.org/users/prev_whats_new/…
    猜你喜欢
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多