Python 使用Matplotlib进行三维打印:隐藏轴但保留轴标签?

Python 使用Matplotlib进行三维打印:隐藏轴但保留轴标签?,python,matplotlib,plot,mplot3d,Python,Matplotlib,Plot,Mplot3d,我正在使用Matplotlib可视化三维阵列。 我得到的几乎是我想要的,除了一个小问题。。。请参阅下面的插图和说明,说明我可以让它做什么以及我希望它做什么 显示一组带有标签的立方体,但也显示一组其他内容 显示一组立方体,但不显示轴标签 这是我想要的,但无法实现。。。我想显示一组带有轴标签的立方体,但没有其他内容 我希望你们能帮我:)看下面的资料 from mpl_toolkits.mplot3d import axes3d import matplotlib.pyplot as plt fro

我正在使用Matplotlib可视化三维阵列。 我得到的几乎是我想要的,除了一个小问题。。。请参阅下面的插图和说明,说明我可以让它做什么以及我希望它做什么

  • 显示一组带有标签的立方体,但也显示一组其他内容
  • 显示一组立方体,但不显示轴标签
  • 这是我想要的,但无法实现。。。我想显示一组带有轴标签的立方体,但没有其他内容
  • 我希望你们能帮我:)看下面的资料

    from mpl_toolkits.mplot3d import axes3d
    import matplotlib.pyplot as plt
    from matplotlib import rcParams
    import numpy as np
    rcParams['axes.labelsize'] = 14
    rcParams['axes.titlesize'] = 16
    rcParams['xtick.labelsize'] = 14
    rcParams['ytick.labelsize'] = 14
    rcParams['legend.fontsize'] = 14
    rcParams['font.family'] = 'serif'
    rcParams['font.serif'] = ['Computer Modern Roman']
    rcParams['text.usetex'] = True
    rcParams['grid.alpha'] = 0.0
    
    def make_cube():
        """ A Cube consists of a bunch of planes..."""
    
        planes = {
            "top"    : ( [[0,1],[0,1]], [[0,0],[1,1]], [[1,1],[1,1]] ),
            "bottom" : ( [[0,1],[0,1]], [[0,0],[1,1]], [[0,0],[0,0]] ),
            "left"   : ( [[0,0],[0,0]], [[0,1],[0,1]], [[0,0],[1,1]] ),
            "right"  : ( [[1,1],[1,1]], [[0,1],[0,1]], [[0,0],[1,1]] ),
            "front"  : ( [[0,1],[0,1]], [[0,0],[0,0]], [[0,0],[1,1]] ),
            "back"   : ( [[0,1],[0,1]], [[1,1],[1,1]], [[0,0],[1,1]] )
        }
        return planes
    
    def render_array(ary, highlight):
        fig = plt.figure()
        ax = fig.add_subplot(111, projection='3d')
    
        cube = make_cube()
    
        for space in xrange(0, ary.shape[0]):
            for column in xrange(0, ary.shape[1]):
                for row in xrange(0, ary.shape[2]):
                    alpha = 0.01
                    if highlight[space,column,row] == 1:
                        alpha = 1
                    for side in cube:
                        (Xs, Ys, Zs) = (
                            np.asarray(cube[side][0])+space+space*0.2,
                            np.asarray(cube[side][2])+row+row*0.2,
                            np.asarray(cube[side][3])+column+column*0.2
                        )
                        ax.plot_surface(Xs, Ys, Zs, rstride=1, cstride=1, alpha=alpha)
    
        highest = 0                         # Make it look cubic
        for size in ary.shape:
            if size > highest:
                highest = size
        ax.set_xlim((0,highest))
        ax.set_ylim((0,highest))
        ax.set_zlim((0,highest))
    
    
        ax.set_xlabel('Third dimension' )   # Meant to visualize ROW-MAJOR ordering 
        ax.set_ylabel('Row(s)')
        ax.set_zlabel('Column(s)')
    
        #plt.axis('off')    # This also removes the axis labels... i want those...
        #ax.set_axis_off()  # this removes too much (also the labels)
    
        # So I try this instead...
        ax.set_xticks([])          # removes the ticks... great now the rest of it
        ax.set_yticks([])
        ax.set_zticks([])
        #ax.grid(False)             # this does nothing....
        #ax.set_frame_on(False)     # this does nothing....
        plt.show()
    
    def main():
    
        subject = np.ones((3,4,3))
    
        highlight = np.zeros(subject.shape) # Highlight a row
        highlight[1,1,:] = 1
    
        render_array(subject, highlight)    # Show it
    
    if __name__ == "__main__":
        main()
    
    更新,感谢您的回答,以下是我遗漏的内容:

    # Get rid of the panes                          
    ax.w_xaxis.set_pane_color((1.0, 1.0, 1.0, 0.0)) 
    ax.w_yaxis.set_pane_color((1.0, 1.0, 1.0, 0.0)) 
    ax.w_zaxis.set_pane_color((1.0, 1.0, 1.0, 0.0)) 
    
    # Get rid of the spines                         
    ax.w_xaxis.line.set_color((1.0, 1.0, 1.0, 0.0)) 
    ax.w_yaxis.line.set_color((1.0, 1.0, 1.0, 0.0)) 
    ax.w_zaxis.line.set_color((1.0, 1.0, 1.0, 0.0))
    
    这将与:

    # Get rid of the ticks                          
    ax.set_xticks([])                               
    ax.set_yticks([])                               
    ax.set_zticks([])
    
    隐藏除标签以外的所有内容,如图3)所示

    更新

    我已清理并使代码进入工作状态,并使其在此处可用:

    这里还有几个其他示例:

    我试图运行您的代码,但它在我的计算机中不起作用

    下面可以看到绘制球体的解决方案。基本上,我手动将窗格和脊椎的颜色设置为
    alpha=0
    ,并将刻度设置为空列表(如您所指出的)

    这是我的输出


    谢谢@Nicogaro,我错过了:“ax.w_xaxis.set_pane_color”和“ax.w_xaxis.line.set_color”。没问题。你能修改你的代码吗?我对运行它感兴趣。。。也许我以后可以用它来可视化张量。我已经清理了它,并在这里提供了它:只是一个提示让你知道-明确地包括一个不寻常的(即很酷的)用例对以后的其他人真的很有帮助!
    from mpl_toolkits.mplot3d import axes3d
    import matplotlib.pyplot as plt
    from matplotlib import rcParams
    import numpy as np
    rcParams['axes.labelsize'] = 18
    rcParams['font.family'] = 'serif'
    rcParams['font.serif'] = ['Computer Modern Roman']
    rcParams['text.usetex'] = True
    
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    
    u = np.linspace(0, 2 * np.pi, 100)
    v = np.linspace(0, np.pi, 100)
    
    x = 10 * np.outer(np.cos(u), np.sin(v))
    y = 10 * np.outer(np.sin(u), np.sin(v))
    z = 10 * np.outer(np.ones(np.size(u)), np.cos(v))
    ax.plot_surface(x, y, z,  rstride=4, cstride=4, color='b')
    
    # Get rid of the panes
    ax.w_xaxis.set_pane_color((1.0, 1.0, 1.0, 0.0))
    ax.w_yaxis.set_pane_color((1.0, 1.0, 1.0, 0.0))
    ax.w_zaxis.set_pane_color((1.0, 1.0, 1.0, 0.0))
    
    # Get rid of the spines
    ax.w_xaxis.line.set_color((1.0, 1.0, 1.0, 0.0))
    ax.w_yaxis.line.set_color((1.0, 1.0, 1.0, 0.0))
    ax.w_zaxis.line.set_color((1.0, 1.0, 1.0, 0.0))
    
    # Get rid of the ticks
    ax.set_xticks([]) 
    ax.set_yticks([]) 
    ax.set_zticks([])
    
    # Add the labels
    ax.set_xlabel('Third dimension' )
    ax.set_ylabel('Row(s)')
    ax.set_zlabel('Column(s)')
    plt.show()