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

使用Matplotlib循环绘制折线图时遇AttributeError错误求助

解决Matplotlib折线图AttributeError及绘图需求实现

问题描述

需要为数据中每个唯一plant_name绘制折线图,展示各站点的Adj_Prod值随月份的变化,生成2幅独立图表。数据如下:

plant_name  month   Adj_Prod    Adj_Prod    Adj_Prod    Adj_Prod    Adj_Prod
0   BIRCH BAY        1  64268.0     64268.0     64268.0     64268.0     64268.0
1   BIRCH BAY        2  131415.5    131415.5    131415.5    131415.5    131415.5
2   BIRCH BAY        3  210202.2    210202.2    210202.2    210202.2    210202.2
3   BIRCH BAY        4  317149.1    317149.1    317149.1    317149.1    317149.1
4   BIRCH BAY        5  432973.8    432973.8    432973.8    432973.8    432973.8
5   BIRCH BAY        6  512809.3    512809.3    512809.3    512809.3    512809.3
6   BIRCH BAY        7  607973.6    607973.6    607973.6    607973.6    607973.6
7   BIRCH BAY        8  687322.8    667062.4    682211.8    680210.6    672797.5
8   BIRCH BAY        9  724324.4    692311.0    726442.7    723927.7    720320.0
9   BIRCH BAY       10  778997.5    764772.8    792752.3    792855.2    788970.0
10  BIRCH BAY       11  833594.9    843887.2    871843.0    874795.6    843567.4
11  BIRCH BAY       12  893822.2    916116.3    927657.8    942680.9    917816.7
12  BARON CHAPEL    1   34218.1      34218.1     34218.1     34218.1     34218.1
13  BARON CHAPEL    2   70853.1      70853.1     70853.1     70853.1     70853.1
14  BARON CHAPEL    3   111367.1    111367.1    111367.1    111367.1    111367.1
15  BARON CHAPEL    4   161482.2    161482.2    161482.2    161482.2    161482.2
16  BARON CHAPEL    5   209338.5    209338.5    209338.5    209338.5    209338.5
17  BARON CHAPEL    6   241771.9    241771.9    241771.9    241771.9    241771.9
18  BARON CHAPEL    7   267183.3    267183.3    267183.3    267183.3    267183.3
19  BARON CHAPEL    8   291989.0    290321.0    294038.6    281854.5    288645.7
20  BARON CHAPEL    9   314834.0    322328.5    318351.3    304571.9    310119.9
21  BARON CHAPEL    10  348497.7    358994.8    349025.9    340384.3    343494.6
22  BARON CHAPEL    11  381433.1    391930.2    383084.3    377981.7    375497.5
23  BARON CHAPEL    12  416721.8    435259.4    415697.2    412921.0    404511.5

编写的代码运行后出现错误:

AttributeError: 'Line2D' object has no property 'edgecolors'

原代码:

import matplotlib.patches
levels, categories = pd.factorize(df1['month'])
colors = [plt.cm.prism(i) for i in levels] 
handles = [matplotlib.patches.Patch(color=plt.cm.prism(i), label=c) for i, c in enumerate(categories)]
sites = (df1.plant_name.unique())
sites = sites.tolist()
fig, ax = plt.subplots(figsize=(10,4))
for i in range(len(sites)):
    plt.figure()
    plt.plot(df1.loc[df1['plant_name']==sites[i]].Adj_Prod, df1.loc[df1['plant_name']==sites[i]].month,edgecolors=colors,marker='o',facecolors='none')
    site = str(sites[i])
    plt.title(site + (' ') + ('Region') + (' Wind Production ') + str(df1.columns[0])  )
    plt.xlabel('Month'); plt.ylabel('Estimated Production')
    plt.legend(handles=handles, title="Year",loc='center left', bbox_to_anchor=(1,0.5),edgecolor='black')
ax.legend()
plt.show() 

错误原因

  1. 参数名称错误:plt.plot中没有edgecolors和facecolors参数,对应的标记边框颜色参数是markeredgecolor(缩写mec),标记填充颜色参数是markerfacecolor(缩写mfc)。
  2. 轴顺序颠倒:需求是展示Adj_Prod随月份变化,应该x轴为month,y轴为Adj_Prod,原代码刚好写反。
  3. 重复列名处理:数据中存在多个同名Adj_Prod列,直接调用df1.Adj_Prod只会返回第一列,需要遍历所有Adj_Prod列。
  4. 图例逻辑错误:原代码用月份生成颜色和图例,但多个Adj_Prod列应该对应不同系列(比如年份),图例应匹配这些系列。

修正后的代码

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.patches

# 先处理重复列名,给多个Adj_Prod列添加年份后缀
adj_prod_cols = [col for col in df1.columns if 'Adj_Prod' in col]
df1.columns = ['plant_name', 'month'] + [f'Adj_Prod_Year{idx+1}' for idx in range(len(adj_prod_cols))]
adj_prod_cols = [col for col in df1.columns if 'Adj_Prod' in col]

# 生成每个Adj_Prod系列的颜色和图例
colors = [plt.cm.prism(i/len(adj_prod_cols)) for i in range(len(adj_prod_cols))]
handles = [matplotlib.patches.Patch(color=colors[i], label=col.split('_')[-1]) 
           for i, col in enumerate(adj_prod_cols)]

sites = df1.plant_name.unique().tolist()

# 循环每个站点绘制独立图表
for site in sites:
    # 筛选当前站点数据
    site_data = df1[df1['plant_name'] == site]
    # 创建新图表
    plt.figure(figsize=(10, 6))
    # 循环每个Adj_Prod系列绘制折线
    for idx, col in enumerate(adj_prod_cols):
        plt.plot(site_data['month'], site_data[col], 
                 marker='o', mec=colors[idx], mfc='none', 
                 linestyle='-', color=colors[idx], label=col.split('_')[-1])
    # 设置图表属性
    plt.title(f'{site} Region Wind Production')
    plt.xlabel('Month')
    plt.ylabel('Estimated Production')
    plt.legend(handles=handles, title="Year", loc='center left', bbox_to_anchor=(1, 0.5), edgecolor='black')
    # 调整布局避免图例遮挡
    plt.tight_layout()
    plt.show()

关键说明

  1. 列名处理:给重复的Adj_Prod列添加年份后缀,方便区分不同系列。
  2. 参数修正:用mec替代edgecolors,mfc替代facecolors,符合Matplotlib的参数规范。
  3. 轴顺序调整:将month作为x轴,Adj_Prod系列作为y轴,符合需求逻辑。
  4. 系列循环:每个站点内循环所有Adj_Prod列,绘制多条折线展示不同年份的生产数据。
  5. 布局优化:使用tight_layout()自动调整图表布局,避免图例遮挡内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 15:06:16