如何在熊猫堆积条形图中更改一个条的颜色

时间:2019-09-03 23:45:41

标签: python pandas matplotlib colors stacked-chart

我想更改熊猫堆积条形图中一个条的颜色。我希望该栏的每个部分都是不同的橙色阴影。

这是我用来创建绘图的DataFrame:

df = pd.DataFrame(index=['A', 'B', 'C', 'D', 'E', 'F', 'G'], 
                  data={'age_13_to_17_results': [17.88321168, 17.44471744, 10.1511879 , 14.5979021 , 15.84756687,
                                                 15.18288475, 12.05357143], 
                        'age_18_to_24_results': [38.32116788, 25.55282555, 35.85313175, 32.77972028, 33.66902997, 
                                                 32.78541105, 28.79464286], 
                        'age_25_to_34_results': [24.45255474, 28.25552826, 26.99784017, 26.83566434, 27.87624879,
                                                 26.3713742 , 22.99107143], 
                        'age_35_to_44_results': [12.40875912, 11.3022113 , 16.41468683, 13.63636364, 12.72155978,
                                                 12.32616015, 15.625     ], 
                        'age_45_to_54_results': [5.10948905, 12.28501229,  6.47948164,  8.21678322,  6.69513374,
                                                 7.95114708, 12.72321429], 
                        'age_55_plus_results':  [1.82481752,  5.15970516,  4.10367171,  3.93356643,  3.22268772,
                                                 5.40393584,  7.8125]})

这是条形图的功能:

def func(colors, A_colors):

    fig = plt.figure(figsize=(22,13))
    ax = plt.subplot()
    plt.box(on=None)    
    height = 0.6

    df[::-1].plot.barh(stacked=True, edgecolor='black', width=height, color=colors, legend=False, ax=ax)

    for p in ax.patches[df.shape[1]::df.shape[0]]:
        p.set_facecolor(A_colors)

我正在使用一个名为“ lighten_color”的函数为条形图中的每个容器分配特定的颜色。该函数的外观如下:

def lighten_color(color, amount=0.5):
    import matplotlib.colors as mc
    import colorsys
    try:
        c = mc.cnames[color]
    except:
        c = color
    c = colorsys.rgb_to_hls(*mc.to_rgb(c))
    return colorsys.hls_to_rgb(c[0], 1 - amount * (1 - c[1]), c[2])

要创建图,我调用函数:

func(colors=[lighten_color('#428bca', 1.4), 
             lighten_color('#428bca', 1.15), 
             lighten_color('#428bca', .9), 
             lighten_color('#428bca', .65), 
             lighten_color('#428bca', .4), 
             lighten_color('#428bca', .15)], 
     A_colors='orange')

然后我得到一个如下图:

stacked bar plot

我不想让顶部的条形全部为橙色阴影,而是希望顶部栏中的每个容器都具有与下面的条形相似的橙色阴影。但是,如果我尝试在函数中为A_colors分配颜色列表,则会出现以下错误:

ValueError: Invalid RGBA argument: [(0.14703613676875715, 0.34955760816723397, 0.5243364122508509), (0.19899692108248268, 0.4730870199319398, 0.7096305298979095), (0.3329411764705885, 0.5905882352941176, 0.8129411764705881), (0.5182352941176473, 0.7043137254901961, 0.8649019607843136), (0.703529411764706, 0.8180392156862746, 0.9168627450980391), (0.8888235294117647, 0.9317647058823529, 0.9688235294117648)]

有人知道在顶部栏中为每个单独的容器分配不同的橙色阴影的方法吗?

0 个答案:

没有答案