Matplotlib 3D Bar chart: axis issue

前端 未结 2 1418
眼角桃花
眼角桃花 2021-02-06 17:20

I am having issue with getting data on x,y,z axis..below is my code. Is there any issue with the way i have defined range(dx,dy.dz) for different axis.

result=[         


        
2条回答
  •  傲寒
    傲寒 (楼主)
    2021-02-06 17:45

    There are the following issues in your code:

    • xpos and ypos are usually a flatenned meshgrid with the positions of the base of the 3D bars
    • zpos gives the position of the base along the z axis, which is usually zero unless you want the bars looking like they are flying
    • xpos, ypos and zpos must have the same flattened shape and must all be 1-D arrays

    Since you know the positions for each value you can use a np.arange() to create the positions xpos and ypos, and afterwards set the tick labels.

    The example code is:

    import numpy as np
    from mpl_toolkits.mplot3d import Axes3D
    import matplotlib.pyplot as plt
    from matplotlib import cm
    
    result=[['122', '109', '2343', '220', '19'],
     ['15', '407', '37', '10', '102'],
     ['100', '100', '100', '100', '100'],
     ['113', '25', '19', '31', '112'],
     ['43', '219', '35', '33', '14'],
     ['132', '108', '256', '119', '14'],
     ['22', '48', '352', '51', '438']]
    
    result = np.array(result, dtype=np.int)
    
    fig=plt.figure(figsize=(5, 5), dpi=150)
    ax1=fig.add_subplot(111, projection='3d')
    
    xlabels = np.array(['10/11/2013', '10/12/2013', '10/13/2013',
                        '10/14/2013', '10/15/2013'])
    xpos = np.arange(xlabels.shape[0])
    ylabels = np.array(['A1','C1','G1','M1','M2','M3','P1'])
    ypos = np.arange(ylabels.shape[0])
    
    xposM, yposM = np.meshgrid(xpos, ypos, copy=False)
    
    zpos=result
    zpos = zpos.ravel()
    
    dx=0.5
    dy=0.5
    dz=zpos
    
    ax1.w_xaxis.set_ticks(xpos + dx/2.)
    ax1.w_xaxis.set_ticklabels(xlabels)
    
    ax1.w_yaxis.set_ticks(ypos + dy/2.)
    ax1.w_yaxis.set_ticklabels(ylabels)
    
    values = np.linspace(0.2, 1., xposM.ravel().shape[0])
    colors = cm.rainbow(values)
    ax1.bar3d(xposM.ravel(), yposM.ravel(), dz*0, dx, dy, dz, color=colors)
    plt.show()
    

    which gives:

    enter image description here

    you can also use the values array proportional to dz:

    values = (dz-dz.min())/np.float_(dz.max()-dz.min())
    

    enter image description here

提交回复
热议问题