Matplotlib 3D Bar chart: axis issue

前端 未结 2 1414
眼角桃花
眼角桃花 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:27

    As the error suggests, your result list has to contain integers, and not strings. You can convert it to integers with list comprehension:

    result = [[int(i) for i in sublist] for sublist in result]
    

    Or, better yet, you can use np.array:

    import numpy as np
    result = np.array(result, dtype=np.int)
    

    Update:

    As bar3d documentation (and example) suggest, ipos arrays should hold the positions of bars; di arrays should hold the distances between bars. Your xpos and ypos lists hold what is called the tick labels. So, you need to change these and then set tick labels of relevant axes to given xpos and ypos. According tho the example provided, you can do it in the following way:

    xpos, ypos = np.meshgrid(np.arange(5)+0.5, np.arange(7)+0.5)
    xpos = xpos.flatten()
    ypos = ypos.flatten()
    zpos = np.zeros(5*7)
    dx = np.ones_like(zpos)
    dy = dx.copy()
    dz = result.flatten()
    xticks=['','10/11/2013','10/12/2013','10/13/2013','10/14/2013','10/15/2013']
    yticks=['','A1','C1','G1','M1','M2','M3','P1']
    ax1.set_xticklabels(xticks)
    ax1.set_yticklabels(yticks)
    
    0 讨论(0)
  • 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

    0 讨论(0)
提交回复
热议问题