Matplotlib中axes.bar如何根据数组值设置条形颜色条件格式
Matplotlib 条形图按数值动态映射颜色实现方案
plt.bar() 没有内置直接传cmap的参数,核心实现逻辑是提前把待映射的数值做归一化处理,从目标色卡中逐个取出对应条形的颜色值,传给bar()的color参数即可,最终效果和scatter()的cmap映射逻辑完全一致。

具体实现步骤
- 导入colormap和数值归一化相关依赖
- 指定用于映射颜色的目标数组(可以是条形高度值,也可以是和条形一一对应的其他自定义数值序列)
- 初始化归一化规则和目标colormap,参考示例的暖黄到深红渐变可以选
YlOrRd色卡,和效果图匹配度很高 - 生成每个条形对应的颜色值,传入
bar()的color参数,替代原来固定的wheat纯色值 - 如需显示颜色条,额外关联标量映射对象添加即可
修改后的适配代码
from matplotlib import cm from matplotlib.colors import Normalize import matplotlib.dates as mdates from matplotlib.dates import date2num import matplotlib.pyplot as plt # 初始化画布和轴 fig, season = plt.subplots() # 配置颜色映射规则:此处以条形高度SRO_20th作为颜色映射源,可替换为任意等长自定义数值数组 color_source = pheno['SRO_20th'] norm = Normalize(vmin=color_source.min(), vmax=color_source.max()) cmap = cm.get_cmap('YlOrRd') bar_colors = cmap(norm(color_source)) # 绘制物候季条形 season.set_ylabel('GPP 20th percent yearly max') season.tick_params('y', colors = 'blue', labelsize =24) # 替换原固定纯色参数为动态生成的颜色数组 season.bar(x = pheno['SRO_SoS'], height= pheno['SRO_20th'], width = pheno['SRO_DateDelta'], zorder=1, color = bar_colors, align = 'edge') season.set_ylim(0,5) # 绘制双Y轴温度曲线 temp = season.twinx() temp.plot(df_w.index, df_w['TA_F'],color = 'red', label = 'Tempurature', linewidth = 2) # 设置X轴属性 temp.set_xlabel('Date') temp.tick_params('x', labelsize =24) temp.set_xlim(date2num([df_w.index.min(), df_w.index.max()])) temp.xaxis.set_major_formatter(mdates.DateFormatter('%d-%m-%Y')) temp.xaxis.set_major_locator(mdates.YearLocator(1, month=1, day=1)) # 设置温度Y轴属性 temp.set_ylabel('Tempurature (C)') temp.tick_params('y', colors = 'red', labelsize =24) temp.set_ylim(2,30) temp.grid(True) # 可选:添加颜色条标注数值和颜色的对应关系 sm = cm.ScalarMappable(norm=norm, cmap=cmap) sm.set_array([]) cbar = fig.colorbar(sm, ax=season, shrink=0.8) cbar.set_label('GPP 20th percent value', fontsize=20) plt.show()
补充说明
- 颜色映射源数组不需要必须是条形高度,只要和条形数量等长,任意数值数组都可作为映射依据(比如按日期先后、关联温度值映射,替换
color_source为对应数组即可) - 不等宽条形的设置和颜色映射逻辑完全独立,不需要修改原有
width参数的传值逻辑 - 可通过替换
cm.get_cmap()的参数切换配色,viridis、Blues、coolwarm等都是Matplotlib内置常用色卡
内容的提问来源于stack exchange,提问作者Giorgio Zampaglione
相关产品推荐
相关产品推荐

