Python Matplotlib 多系外行星模拟数据文件读取与子图生成实现
多文件批量读取与Matplotlib子图生成实现方案
- 适配前提:所有待读取文件格式与原单文件处理脚本完全一致,第1列为时间(单位:年,范围0-100万年)、第8列为全球温度,所有文件的时间列数据完全统一,仅温度数值随模拟参数变化
- 核心实现逻辑:
- 复用原有脚本的逐行分割、指定列读取的解析规则,不改动原有数据提取逻辑
- 基于
os模块实现目标文件夹下同类型文件的自动遍历,无需硬编码单文件路径 - 自动生成网格布局子图,统一X轴范围与刻度,避免不同子图坐标轴错位
import os import matplotlib.pyplot as plt # -------------------------- 用户可自定义配置项 -------------------------- # 存放所有模拟输出文件的根文件夹路径 data_folder = r"C:\Users\sasuk\OneDrive\Desktop\GJ 229 Planet Data\Gj 229 b - [SemiMajor 0.867][Ecc][Mass][Luminosity]" # 匹配同格式模拟文件的后缀(与现有文件的后缀保持一致) match_suffix = ".forward" # 子图网格布局(根据待处理文件总数调整,比如处理4个文件就设为2行2列) subplot_grid = (2, 2) # X轴时间范围(匹配0-100万年的模拟区间) x_range = (0, 1_000_000) # ------------------------------------------------------------------------ # 遍历收集所有符合规则的文件路径 file_list = [] for _, _, file_names in os.walk(data_folder): for name in file_names: if name.endswith(match_suffix): full_path = os.path.join(data_folder, name) file_list.append(full_path) # 创建画布与共享X轴的子图 fig, axs = plt.subplots( nrows=subplot_grid[0], ncols=subplot_grid[1], sharex=True, figsize=(12, 8) ) # 将二维子图数组展开为一维,方便循环索引 axs = axs.flatten() # 逐文件读取数据并绘制到对应子图 for idx, path in enumerate(file_list): if idx >= len(axs): break time_data = [] temp_data = [] # 逐行读取数据,完全沿用原有读取逻辑 with open(path, "r") as f: for line in f: split_content = line.split() time_data.append(float(split_content[0])) temp_data.append(float(split_content[7])) # 在对应子图上绘制温度曲线 axs[idx].plot(time_data, temp_data) # 用文件名作为子图标题,标注不同模拟参数 axs[idx].set_title(os.path.basename(path), fontsize=9) axs[idx].set_ylabel("全球温度") # 统一设置最下方子图的X轴标签,设置全局X范围 axs[-1].set_xlabel("时间(年)") plt.xlim(x_range) # 自动调整子图间距,避免标签、标题重叠 plt.tight_layout() plt.show()
注意事项:如果数据文件的列是由多空格/制表符分割的,现有
split()方法会自动处理连续分割符,和原脚本中split(' ')的逻辑完全兼容;如果后续需要修改子图布局,仅需要调整配置区的subplot_grid参数即可,不需要改动核心代码逻辑。
内容的提问来源于stack exchange,提问作者Zachary Kennedy
相关产品推荐
相关产品推荐

