如何为多索引DataFrame基于y值创建颜色映射?
多索引列DataFrame条形图实现按值映射颜色的问题
我已经能在单索引DataFrame中实现条形图颜色按值映射的需求,代码如下:
func_df=pd.DataFrame(pd.concat([df[col].sort_values().iloc[1::2],df[col].sort_values().iloc[-1::-2]])) fig, ax = plt.subplots(figsize=fig_size) my_cmap = plt.cm.get_cmap('afmhot_r') colors = my_cmap(func_df[col]) rects = ax.bar(x=func_df[col].index, height=func_df[col], color=colors)
此时colors返回的数组为:
array([[1. , 0.84901961, 0.34901961, 1. ], [0.58039216, 0.08039216, 0. , 1. ], [0.47843137, 0. , 0. , 1. ], [0.22745098, 0. , 0. , 1. ], [0.58039216, 0.08039216, 0. , 1. ], [1. , 0.66862745, 0.16862745, 1. ], [1. , 1. , 0.56862745, 1. ]])
这段代码能生成颜色与柱高关联的条形图。
现在我有一个带多索引列的DataFrame,用一行代码就能生成多组条形图:
df.loc[:,(['Covid','Malaria','TB'],['AgOr1'])].plot.bar()
但尝试给这个多组条形图应用按值映射的颜色时:
my_cmap = plt.cm.get_cmap('afmhot_r') colors = my_cmap(df.loc[:, pd.IndexSlice[:, ['AgOr1']]].fillna(0)) df.loc[:,(['Covid','Malaria','TB'], ['AgOr1'])].plot.bar(color=colors)
出现了如下错误:
ValueError: Invalid color [[0.58039216 0.08039216 0. 1. ] [0.58039216 0.08039216 0. 1. ] [1. 1. 1. 1. ]]
我猜测是df.plot.bar(color=colors)无法处理我生成的颜色映射数组,或者是我的操作有误,但作为Python新手不知道怎么解决,希望能得到可测试的解决思路。
附DataFrame示例数据
df.head(20).to_dict(orient='list') Output: {('Covid', 'AgOr1'): [0.05633802816901407, 0.061459667093469894, 0.2676056338028169, 0.1024327784891165, 0.048655569782330335, 0.10627400768245837, 0.00768245838668373, nan, nan, nan], ('Covid', 'AgOr2'): [0.02933673469387755, 0.012755102040816327, 1.0, 0.012755102040816327, 0.005612244897959183, 0.030612244897959183, 0.02933673469387755, nan, nan, nan], ('Covid', 'AgOr3'): [0.5092592592592592, 0.537037037037037, 0.48148148148148145, 0.7037037037037037, 0.7962962962962963, 0.7685185185185185, 0.25925925925925924, nan, nan, nan], ('Covid', 'AgOr4'): [0.04524699045246991, 0.20921544209215445, 0.27148194271481946, 0.0660024906600249, 0.13864674138646743, 0.026567040265670402, 0.5848899958489, nan, nan, nan], ('Covid', 'AgOr5'): [0.04418604651162791, 0.034883720930232565, 0.09627906976744185, 0.043255813953488376, 0.13953488372093023, 0.06744186046511629, 0.02325581395348838, nan, nan, nan], ('Malaria', 'AgOr1'): [0.05633802816901407, 0.061459667093469894, 0.2676056338028169, 0.1024327784891165, nan, nan, nan, 0.04993597951344429, 0.09603072983354671, nan], ('Malaria', 'AgOr2'): [0.02933673469387755, 0.012755102040816327, 1.0, 0.012755102040816327, nan, nan, nan, 0.047193877551020405, 0.10969387755102039, nan], ('Malaria', 'AgOr3'): [0.5092592592592592, 0.537037037037037, 0.48148148148148145, 0.7037037037037037, nan, nan, nan, 0.37037037037037035, 0.6203703703703703, nan], ('Malaria', 'AgOr4'): [0.04524699045246991, 0.20921544209215445, 0.27148194271481946, 0.0660024906600249, nan, nan, nan, 0.27563304275633044, 0.2673308426733085, nan], ('Malaria', 'AgOr5'): [0.04418604651162791, 0.034883720930232565, 0.09627906976744185, 0.043255813953488376, nan, nan, nan, 0.034883720930232565, 0.04883720930232559, nan], ('TB', 'AgOr1'): [nan, nan, nan, 0.1024327784891165, 0.048655569782330335, nan, 0.00768245838668373, nan, nan, 0.07682458386683737], ('TB', 'AgOr2'): [nan, nan, nan, 0.012755102040816327, 0.005612244897959183, nan, 0.02933673469387755, nan, nan, 0.022959183673469385], ('TB', 'AgOr3'): [nan, nan, nan, 0.7037037037037037, 0.7962962962962963, nan, 0.25925925925925924, nan, nan, 0.41666666666666663], ('TB', 'AgOr4'): [nan, nan, nan, 0.0660024906600249, 0.13864674138646743, nan, 0.5848899958489, nan, nan, 0.2922374429223745], ('TB', 'AgOr5'): [nan, nan, nan, 0.043255813953488376, 0.13953488372093023, nan, 0.02325581395348838, nan, nan, 0.018604651162790704]}
内容的提问来源于stack exchange,提问作者JayJay
相关产品推荐
相关产品推荐

