使用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()
错误原因
- 参数名称错误:
plt.plot中没有edgecolors和facecolors参数,对应的标记边框颜色参数是markeredgecolor(缩写mec),标记填充颜色参数是markerfacecolor(缩写mfc)。 - 轴顺序颠倒:需求是展示
Adj_Prod随月份变化,应该x轴为month,y轴为Adj_Prod,原代码刚好写反。 - 重复列名处理:数据中存在多个同名
Adj_Prod列,直接调用df1.Adj_Prod只会返回第一列,需要遍历所有Adj_Prod列。 - 图例逻辑错误:原代码用月份生成颜色和图例,但多个
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()
关键说明
- 列名处理:给重复的
Adj_Prod列添加年份后缀,方便区分不同系列。 - 参数修正:用
mec替代edgecolors,mfc替代facecolors,符合Matplotlib的参数规范。 - 轴顺序调整:将
month作为x轴,Adj_Prod系列作为y轴,符合需求逻辑。 - 系列循环:每个站点内循环所有
Adj_Prod列,绘制多条折线展示不同年份的生产数据。 - 布局优化:使用
tight_layout()自动调整图表布局,避免图例遮挡内容。
内容的提问来源于stack exchange,提问作者user2100039
相关产品推荐
相关产品推荐

