如何基于轴字符串值为Matplotlib水平条形图设置分组颜色?
如何为水平条形图的特定国家(字符串轴)设置分组颜色
嘿,我刚好碰到过类似的需求!你现在的问题是要给字符串轴的条形图按国家组设置不同颜色,其实不用纠结axhspan或者掩码,直接给每个条形指定对应颜色就简单多了,我给你改改代码,顺便讲清楚思路:
核心思路
我们可以先建立一个国家-颜色的映射字典,然后根据你的国家列表生成对应的颜色列表,最后把这个颜色列表传给barh的color参数就行。如果国家数量多的话,按组来管理颜色会更清晰易维护。
修改后的完整代码
import pandas as pd import numpy as np import matplotlib.pyplot as plt # 模拟数据 country_names = ['usa','brazil','canada'] country_rank = pd.Series(np.random.randn(3), index=country_names) plt.rcdefaults() fig, ax = plt.subplots(figsize=(10,15)) y_pos = np.arange(len(country_names)) error = np.zeros(len(country_names)) # 方式1:直接单个国家映射(适合少量国家) color_map = { 'usa': 'yellow', 'canada': 'yellow', 'brazil': 'green' # 后续可扩展:比如'france':'blue', 'uk':'blue', 'japan':'orange'... } # 方式2:按组管理(适合50个国家的场景,更易维护) # country_groups = { # 'north_america': {'countries': ['usa', 'canada'], 'color': 'yellow'}, # 'south_america': {'countries': ['brazil'], 'color': 'green'}, # 'europe': {'countries': ['france', 'uk'], 'color': 'blue'}, # 'asia': {'countries': ['japan', 'hong_kong'], 'color': 'orange'} # } # # 从分组生成颜色映射字典 # color_map = {} # for group in country_groups.values(): # for country in group['countries']: # color_map[country] = group['color'] # 生成每个条形对应的颜色列表 colors = [color_map[country] for country in country_names] # 绘制条形图,传入颜色列表替代统一的'green' ax.barh(y_pos, country_rank, color=colors, xerr=error, align='center', ecolor='black') ax.set_yticks(y_pos) ax.set_yticklabels(country_names) ax.invert_yaxis() # 标签从上到下读取 ax.set_xlabel('Strategy Score') ax.set_title('Global Large Cap Index Allocation Model') ax.set_yticklabels(country_names, ha='left', minor=False) ax.yaxis.tick_right() plt.tight_layout() plt.show()
为什么这个方法可行?
- 不管y轴是字符串还是数值,每个条形都对应
y_pos里的一个位置,我们通过颜色列表把每个位置的颜色精准对应到国家,比用axhspan(更适合数值区间)更直接精准。 - 按组管理的方式适配你有50个国家的场景,只需要维护分组字典,不用逐个编写每个国家的颜色,后期调整分组或颜色也更高效。
你可以根据自己的实际分组需求调整color_map或者country_groups里的内容,肯定能达到你要的分组突出显示效果!
内容的提问来源于stack exchange,提问作者Aaron
相关产品推荐
相关产品推荐

