ValueError: Invalid RGBA argument: What is causing this error?

前端 未结 2 1024
悲&欢浪女
悲&欢浪女 2020-12-06 16:56

I am trying to create a 3D colored bar chart using ideas from: this stackoverflow post.

First I create a 3D bar chart with the following code:

import         


        
相关标签:
2条回答
  • 2020-12-06 17:13

    The error message is misleading. You're getting a ValueError because the shape of colors is wrong, not because an RGBA value is invalid.

    When coloring each bar a single color, color should be an array of length N, where N is the number of bars. Since there are 8281 bars,

    In [121]: x_data.shape
    Out[121]: (8281,)
    

    colors should have shape (8281, 4). But instead, the posted code generates an array of shape (91, 91, 4):

    In [123]: colors.shape
    Out[123]: (91, 91, 4)
    

    So to fix the problem, use color=colors.reshape(-1,4).


    import numpy as np
    import matplotlib.colors as colors
    import matplotlib.cm as cm
    import matplotlib.pyplot as plt
    from mpl_toolkits.mplot3d import Axes3D
    
    samples = np.random.randint(91,size=(5000,2))
    
    F = np.zeros([91,91])
    for s in samples:
        F[s[0],s[1]] += 1
    
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    x_data, y_data = np.meshgrid( np.arange(F.shape[1]),
                                  np.arange(F.shape[0]) )
    x_data = x_data.flatten()
    y_data = y_data.flatten()
    z_data = F.flatten()
    
    dz = F
    offset = dz + np.abs(dz.min())
    fracs = offset.astype(float)/offset.max()
    norm = colors.Normalize(fracs.min(), fracs.max())
    colors = cm.jet(norm(fracs))
    
    ax.bar3d(x_data,y_data,np.zeros(len(z_data)),1,1,z_data,color=colors.reshape(-1,4) )
    plt.show()
    

    0 讨论(0)
  • 2020-12-06 17:30

    The color argument expects a 1D array, similar to all other arguments of bar3d.

    Hence, you need to replace the line offset = dz + np.abs(dz.min())

    by

    offset = z_data + np.abs(z_data.min())
    

    for your case. dz is not useful here (maybe it was in the linked example).
    Note that color=np.random.rand(len(z_data),4) would equally work.

    Then the result will be

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