Bli*_*ink 14 python matplotlib mplot3d
我正在使用Python中的Matplotlib做一些3D表面图,并注意到一种恼人的现象.根据我设置视点(摄像机位置)的方式,垂直(z)轴在左侧和右侧之间移动.以下是两个示例:示例1,左侧轴,示例2,右侧轴.第一个例子有ax.view_init(25,-135),而第二个例子有ax.view_init(25,-45).
我想保持观点相同(查看数据的最佳方式).有没有办法强制轴到一侧或另一侧?
wol*_*evo 10
我需要类似的东西:在两边绘制zaxis.感谢@crayzeewulf的回答,我来到了解决方法(左,右或双方):

首先根据需要绘制3d,然后在使用Wrapper类调用show()wrap 之前Axes3D简单地覆盖该draw()方法.
Wrapper类调用只是将某些功能的可见性设置为False,它自己绘制并最终使用修改过的PLANES绘制zaxis.此包装类允许您在左侧,右侧或两侧绘制zaxis.
import matplotlib
matplotlib.use('QT4Agg')
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
class MyAxes3D(axes3d.Axes3D):
    def __init__(self, baseObject, sides_to_draw):
        self.__class__ = type(baseObject.__class__.__name__,
                              (self.__class__, baseObject.__class__),
                              {})
        self.__dict__ = baseObject.__dict__
        self.sides_to_draw = list(sides_to_draw)
        self.mouse_init()
    def set_some_features_visibility(self, visible):
        for t in self.w_zaxis.get_ticklines() + self.w_zaxis.get_ticklabels():
            t.set_visible(visible)
        self.w_zaxis.line.set_visible(visible)
        self.w_zaxis.pane.set_visible(visible)
        self.w_zaxis.label.set_visible(visible)
    def draw(self, renderer):
        # set visibility of some features False 
        self.set_some_features_visibility(False)
        # draw the axes
        super(MyAxes3D, self).draw(renderer)
        # set visibility of some features True. 
        # This could be adapted to set your features to desired visibility, 
        # e.g. storing the previous values and restoring the values
        self.set_some_features_visibility(True)
        zaxis = self.zaxis
        draw_grid_old = zaxis.axes._draw_grid
        # disable draw grid
        zaxis.axes._draw_grid = False
        tmp_planes = zaxis._PLANES
        if 'l' in self.sides_to_draw :
            # draw zaxis on the left side
            zaxis._PLANES = (tmp_planes[2], tmp_planes[3],
                             tmp_planes[0], tmp_planes[1],
                             tmp_planes[4], tmp_planes[5])
            zaxis.draw(renderer)
        if 'r' in self.sides_to_draw :
            # draw zaxis on the right side
            zaxis._PLANES = (tmp_planes[3], tmp_planes[2], 
                             tmp_planes[1], tmp_planes[0], 
                             tmp_planes[4], tmp_planes[5])
            zaxis.draw(renderer)
        zaxis._PLANES = tmp_planes
        # disable draw grid
        zaxis.axes._draw_grid = draw_grid_old
def example_surface(ax):
    """ draw an example surface. code borrowed from http://matplotlib.org/examples/mplot3d/surface3d_demo.html """
    from matplotlib import cm
    import numpy as np
    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)
    surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.coolwarm, linewidth=0, antialiased=False)
if __name__ == '__main__':
    fig = plt.figure(figsize=(15, 5))
    ax = fig.add_subplot(131, projection='3d')
    ax.set_title('z-axis left side')
    ax = fig.add_axes(MyAxes3D(ax, 'l'))
    example_surface(ax) # draw an example surface
    ax = fig.add_subplot(132, projection='3d')
    ax.set_title('z-axis both sides')
    ax = fig.add_axes(MyAxes3D(ax, 'lr'))
    example_surface(ax) # draw an example surface
    ax = fig.add_subplot(133, projection='3d')
    ax.set_title('z-axis right side')
    ax = fig.add_axes(MyAxes3D(ax, 'r'))
    example_surface(ax) # draw an example surface
    plt.show()
正如OP在下面的评论中所指出的,下面提出的方法没有为原始问题提供充分的答案.
如本笔记所述,axis3d中有许多硬编码值,因此很难自定义其行为.所以,我认为在当前的API中没有一种好的方法可以做到这一点.您可以通过修改如下所示的_PLANES参数来"破解"它zaxis:
tmp_planes = ax.zaxis._PLANES 
ax.zaxis._PLANES = ( tmp_planes[2], tmp_planes[3], 
                     tmp_planes[0], tmp_planes[1], 
                     tmp_planes[4], tmp_planes[5])
view_1 = (25, -135)
view_2 = (25, -45)
init_view = view_2
ax.view_init(*init_view)
现在无论你如何旋转图形,z轴都将始终位于图的左侧(只要正z方向指向上方).x轴和y轴将保持翻转.您可以使用_PLANES并且可能能够获得所有轴的所需行为,但这可能会在将来的版本中中断matplotlib.
| 归档时间: | 
 | 
| 查看次数: | 7189 次 | 
| 最近记录: |