You need to enable JavaScript to run this app. Python如何使用for循环读取多份CSV后在subplots子图中分别绘图
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 14:54:06