Matplotlib循环绘制多折线图报错及自定义绘图需求解决
解决plt.subplots(111)导致的AttributeError及批量DataFrame误差可视化方案
错误原因解析
你写的fig, ax = plt.subplots(111)是错误的调用方式:
- matplotlib的
subplots()方法中,若传入单个整数参数,会被解析为nrows=该整数, ncols=1,所以111会创建111行1列的子图网格,返回的ax是一个numpy数组(包含111个轴对象),而非单个轴对象。 - 后续你尝试调用
ax.yaxis这类单个轴的方法时,自然会触发AttributeError: 'numpy.ndarray' object has no attribute 'yaxis'。
修正方案+完整实现代码
下面是针对你的需求的完整可运行代码,包含正确的子图创建、批量线性回归、百分比误差计算与可视化:
1. 导入依赖库
import pandas as pd import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression
2. 准备你的DataFrames集合(替换成你实际的200个DataFrame列表)
这里用随机数据生成模拟示例:
# 生成10个结构一致的DataFrame(特征x,目标y) df_list = [] for i in range(10): df = pd.DataFrame({ 'x': range(1, 21), 'y': [3*num + 2 + pd.np.random.randn()*5 for num in range(1,21)] }) df_list.append(df)
3. 正确创建子图+批量处理与绘图
# 正确创建单个子图,自定义尺寸(宽12,高8) fig, ax = plt.subplots(figsize=(12, 8)) # 循环处理每个DataFrame for idx, df in enumerate(df_list): # 提取特征和目标变量 X = df[['x']] y_true = df['y'] # 拟合线性回归模型 model = LinearRegression() model.fit(X, y_true) # 预测并计算百分比误差 y_pred = model.predict(X) percent_error = ((y_true - y_pred) / y_true) * 100 # 绘制百分比误差折线,添加标签方便区分 ax.plot(df['x'], percent_error, label=f'DataFrame {idx+1}', alpha=0.6) # 自定义图表样式 ax.set_title('所有DataFrame的百分比误差折线图', fontsize=14, pad=20) ax.set_xlabel('X轴变量', fontsize=12) ax.set_ylabel('百分比误差 (%)', fontsize=12) # 旋转X轴刻度45度,避免重叠 ax.tick_params(axis='x', rotation=45) # 200个图例会拥挤,可注释掉或调整位置 # ax.legend(bbox_to_anchor=(1.05, 1), loc='upper left') # 调整布局,防止标签被截断 plt.tight_layout() # 显示或保存图表 plt.show() # plt.savefig('percent_error_plot.png', dpi=300, bbox_inches='tight')
关键细节说明
- 子图创建:
plt.subplots(figsize=(12,8))默认创建1行1列的单个子图,返回的ax是单个轴对象,可正常调用所有轴方法。 - 百分比误差计算:公式
((真实值-预测值)/真实值)*100是常用的相对误差计算方式,你可根据需求调整(比如用绝对值、或基于预测值计算)。 - 200条折线优化:如果200条折线重叠严重,可添加
alpha=0.6设置半透明,或只绘制误差统计线(比如均值、中位数),避免图表混乱。 - 刻度旋转:
ax.tick_params(axis='x', rotation=45)实现X轴刻度旋转,tight_layout()确保标签不被截断。
内容的提问来源于stack exchange,提问作者hulio_entredas
相关产品推荐
相关产品推荐

