You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 00:36:27