Python如何使用for循环读取多份CSV后在subplots子图中分别绘图
代码修正及实现方案
你现有代码的核心问题出在子图对象的遍历逻辑和plt.subplots返回值接收顺序上,修正后的完整代码如下:
import matplotlib.pyplot as plt import numpy as np import pandas as pd import os pd.set_option('display.max_columns', None) pd.set_option('display.max_rows', None) # 修正1:plt.subplots返回值顺序是 画布在前,子图数组在后 fig, ax = plt.subplots(4,4,sharex=False, sharey=False, figsize=(22, 10), dpi=70, linewidth=0.5) # 把4x4的二维子图数组展平为一维,方便遍历 ax_list = ax.flatten() def loop_directory(directory): # 先筛选出所有csv文件路径,避免边遍历边判断的逻辑混乱 csv_files = [] for filename in os.listdir(directory): if filename.endswith(".csv"): csv_files.append(os.path.join(directory, filename)) # 修正2:让子图对象和csv文件一一配对遍历,最多取16份(4*4) for axes, file_path in zip(ax_list, csv_files): df = pd.read_csv(file_path) # 过滤无效值 df = df[df['Tavg'] != -999] # 处理时间列 df["Year&Month"] = pd.to_datetime(df[['Year','Month']].astype(str).agg("/".join,axis=1)) x = df["Year&Month"] y = df["Tavg"] # 直接在当前子图对象上绘图 axes.plot(x, y) # 可选:设置子图标题为文件名,方便区分 axes.set_title(os.path.basename(file_path)) # 可选:自动调整子图间距避免重叠 fig.tight_layout() plt.show() if __name__ == "__main__": loop_directory(r"C:\Users\LAB312\Desktop\vietnam\anomaly")
关键逻辑说明
- 4×4的子图数组默认是二维结构(shape为(4,4)),用
flatten()方法转为长度16的一维数组后,就可以直接和CSV文件列表配对遍历,每个文件对应唯一的子图对象 zip()方法会按位置配对两个列表的元素,当CSV文件数量超过16时,只会取前16份匹配子图,不会出现索引越界报错- 绘图时直接调用当前子图对象
axes的plot()方法即可,不需要再操作df的索引或者列遍历
内容的提问来源于stack exchange,提问作者9S47L852
相关产品推荐
相关产品推荐

