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

Python使用Matplotlib按条件设置子图背景色时代码报错如何解决?

问题分析
  • 核心报错原因:df.query(f'wagon == {i}')['dia'][0]的取值方式错误,query返回的Series会保留原DataFrame的行索引,比如筛选wagon=3的行时,返回的行索引是4、5,直接用[0]索引会触发KeyError,不存在对应索引的元素。
  • 冗余操作:代码中重复调用query筛选同一wagon的数据集,无意义增加运算量。
修复后的完整代码
import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame({'wagon' : [1, 1, 2, 2, 3, 3], 'ind' : [55, 55, 65, 65, 78, 78], 'axl1' : [1, 3, 1, 9, 1, 5], 
                   'axl2' : [1, 4, 1, 5, 1, 12], 'dia' : [2, 2, 1, 1, 3, 3], 'defects' : ['диаметр', 'диаметр', 'перекос', 'перекос', 'обод', 'обод']})

wags = df['wagon'].unique()
inds = df['ind'].unique()
defect = df['defects'].unique()

for (i, j, k) in tuple(zip(wags, inds, defect)):
    # 提前提取当前wagon对应的子数据集,避免重复查询
    sub_df = df[df['wagon'] == i]
    fig, axs = plt.subplots(1, 2, figsize = (10, 5)) # 调整宽度避免子图挤压

    axs[0].plot(sub_df['axl1'].values, marker = 'o')
    axs[0].set_xlabel('distance')
    
    axs[1].plot(sub_df['axl2'].values, marker = 'o')
    # 用iloc[0]取筛选结果的第一个元素,不受原索引影响
    if sub_df['dia'].iloc[0] > 2:
        axs[1].set_facecolor('#e8f4f8') # 浅蓝背景,也可按需替换为其他颜色
    
    axs[1].set_xlabel('distance')  
    fig.suptitle(f'Wagon = {i}, Defect = {k}', fontsize = 16)

    plt.show()
修改说明
  • 新增子数据集提前提取逻辑,减少重复的筛选操作
  • 用.iloc[0]取筛选后子数据集的第一个dia值,完全避开原DataFrame索引的影响
  • 调整了画布宽度避免子图内容挤压,背景色替换为更适合查看数据的浅蓝,你也可以按需改成其他有效色值
  • 把重复的axs[1]绘图逻辑移到判断外,减少代码冗余

内容的提问来源于stack exchange,提问作者Roman Lents

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 12:45:01