【问题标题】:How to disable perspective in mplot3d?如何在 mplot3d 中禁用透视?
【发布时间】:2014-05-24 02:25:04
【问题描述】:

在 mplot3d 中绘图时是否可以禁用透视,即使用正交投影?

【问题讨论】:

    标签: python matplotlib mplot3d


    【解决方案1】:

    自 matplot 版本 2.2.2 Whats new | github987654321@ 起正式包含此功能

    因此,要绘制透视正交图,您必须添加 proj_type = 'ortho' 然后您应该有类似的内容:

    fig.add_subplot(121, projection='3d', proj_type = 'ortho')
    

    示例图片

    ]2 示例取自官方示例script并编辑

    '''
    ======================
    3D surface (color map)
    ======================
    
    Demonstrates plotting a 3D surface colored with the coolwarm color map.
    The surface is made opaque by using antialiased=False.
    
    Also demonstrates using the LinearLocator and custom formatting for the
    z axis tick labels.
    '''
    
    from mpl_toolkits.mplot3d import Axes3D
    import matplotlib.pyplot as plt
    from matplotlib import cm
    from matplotlib.ticker import LinearLocator, FormatStrFormatter
    import numpy as np
    
    # Make data.
    X = np.arange(-5, 5, 0.25)
    Y = np.arange(-5, 5, 0.25)
    X, Y = np.meshgrid(X, Y)
    R = np.sqrt(X**2 + Y**2)
    Z = np.sin(R)
    
    # Plot the surface.
    fig = plt.figure(figsize=(16,4))
    ax.view_init(40, 60)
    ax = fig.add_subplot(121, projection='3d')
    surf = ax.plot_surface(X, Y, Z, cmap=cm.coolwarm,
                           linewidth=0, antialiased=False)
    ax.set_zlim(-1.01, 1.01)
    ax.zaxis.set_major_locator(LinearLocator(10))
    ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))
    
    
    ax = fig.add_subplot(122, projection='3d', proj_type = 'ortho')
    # Plot the surface.
    surf = ax.plot_surface(X, Y, Z, cmap=cm.viridis, linewidth=0, antialiased=False)
    ax.set_zlim(-1.01, 1.01)
    ax.zaxis.set_major_locator(LinearLocator(10))
    ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))
    
    plt.show()
    

    【讨论】:

    • 这个答案是目前有效的,谢谢!!
    【解决方案2】:

    注意:此内容已更新,请参阅 this answer

    有点,你可以在绘图之前运行这段 sn-p 代码:

    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发现的一个未解决问题。

    【讨论】:

    • 成功了,谢谢!虽然轴方向看起来相反,但这可能可以通过使用这个变换矩阵中的符号/顺序来解决。
    • 看来,在最后一行的第三列放置一个小的负数(例如 -0.0001)而不是零有助于避免矩阵奇点问题,并解决了奇怪的轴方向反转问题。跨度>
    • 那之后我怎样才能回到预期视图?
    • @AhmadSultan:我猜你需要在替换之前存储原始投影,比如persp_proj = proj3d.persp_transformation,然后再分配orthogonal_proj。但从 2.2.2 版开始,您只需 set_proj_type('persp')。
    • @uhoh 我在顶部添加了一条注释,以查看下面的答案。
    猜你喜欢
    • 2012-07-03
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    相关资源
    最近更新 更多