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

Matplotlib柱状图:基于列表批量设置指定年份柱子颜色的问题

解决Matplotlib批量修改指定年份柱子颜色的问题

核心问题分析

你之前单个年份判断能生效,但批量匹配出错,原因是:

  • 直接用numpy数组做i == np.array(target_years)会返回布尔数组,if语句无法直接识别,因此触发"需使用a.any()"警告
  • 改用Python列表的in操作可直接判断单个年份是否在目标列表中,逻辑更直观,适合新手快速实现

修改后的代码

import matplotlib.pyplot as plt
import numpy as np

# 导入CSV,第一列为年份列表
with open("./data.csv") as data:
    # 读取时指定年份为整数类型,避免float与整数匹配的误差
    x, y, z = np.genfromtxt(
        (line.replace(',', '.') for line in data),
        delimiter=";",
        usecols=(0,1,2),
        unpack=True,
        dtype=[('year', int), ('y_val', float), ('z_val', float)]
    )
    # 拆分数据方便后续调用
    x = x['year']
    y = y['y_val']
    z = z['z_val']

width = 0.35  # 柱子宽度
yearticks = [1990, 1998, 2008, 2021]            
# 定义需要改色的目标年份列表
target_years = [1991, 1998, 2008]
# 批量生成颜色:目标年份设为蓝色,其余为红色
color1 = ["blue" if year in target_years else "red" for year in x]

fig, ax = plt.subplots()
rects1 = ax.bar(x - width/2, y, width, label='y-axis', color=color1)
rects2 = ax.bar(x + width/2, z, width, label='z-axis')

ax.set_ylabel('ylabel')
ax.set_title('xlabel')
ax.set_xticks(yearticks)
plt.legend()
plt.show()

关键修改点

  1. 年份类型统一:读取CSV时指定年份为int类型,避免默认float类型与整数列表匹配时的类型误差
  2. 批量颜色判断:用列表推导式结合in操作,直接判断每个年份是否在目标列表中,逻辑简单易维护
  3. 可扩展性:只需修改target_years列表,就能批量增减需要改色的年份,无需重复编写多个if条件

备选简化方案(若年份读取后为float类型)

如果不想修改genfromtxt的dtype参数,可在判断时将年份转为int:

target_years = [1991, 1998, 2008]
color1 = ["blue" if int(year) in target_years else "red" for year in x]

内容的提问来源于stack exchange,提问作者jimbo batzke

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 18:01:11