You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Matplotlib子图中分离多文件数据并独立绘图?

解决Matplotlib子图重复显示相同内容的问题

嘿,我瞅了你的代码,发现问题出在数据收集和绘图循环的逻辑上——这才导致所有子图都长得一模一样。咱们拆解一下问题,再给你修正方案:

问题出在哪?

  1. 多余的嵌套循环导致数据重复收集:你在读取每个文件的数据后,又加了一层for x,y in data循环,每次循环都把整个文件的x/y数组重新赋值并添加到xs和ys里。这意味着一个有N行数据的文件,会被重复添加N次到列表里,完全没必要。
  2. 绘图循环逻辑错误:第二个循环里,你对每个子图axs[i],都遍历了xs和ys里的所有数据对,把所有文件的曲线都画到了同一个子图上。结果就是每个子图都包含了所有数据,看起来自然全一样。

修正方案

方案1:边读数据边绘图(更高效)

直接在读取每个文件时,就用对应的子图绘图,省去额外的数据存储步骤:

import matplotlib.pyplot as plt
import numpy as np
import glob

fig, axs = plt.subplots(2,3, sharex=True, figsize=(10,7))
axs = axs.ravel()
filenames = sorted(glob.glob('*.txt'))  # 按顺序获取所有txt文件

# 遍历文件和对应的子图索引
for idx, file in enumerate(filenames):
    # 读取数据:跳过前2行,制表符分隔
    data = np.loadtxt(file, delimiter='\t', skiprows=2)
    x = data[:, 0]
    y = data[:, 1]
    # 用当前索引的子图绘制对应文件的数据
    axs[idx].plot(x, y)
    # 给子图加标题,方便区分是哪个文件的结果
    axs[idx].set_title(f'File: {file}')

# 调整布局,避免标题和标签重叠
plt.tight_layout()
plt.show()

方案2:先正确收集数据再绘图

如果需要先把所有数据存起来再处理,那要保证每个文件的数据只被收集一次:

import matplotlib.pyplot as plt
import numpy as np
import glob

fig, axs = plt.subplots(2,3, sharex=True, figsize=(10,7))
axs = axs.ravel()
xs = []
ys = []
filenames = sorted(glob.glob('*.txt'))

# 正确收集每个文件的x/y数据,去掉多余的嵌套循环
for file in filenames:
    data = np.loadtxt(file, delimiter='\t', skiprows=2)
    xs.append(data[:, 0])
    ys.append(data[:, 1])

# 一一对应绘图:每个子图只绘制对应文件的数据
for i in range(len(filenames)):
    axs[i].plot(xs[i], ys[i])
    axs[i].set_title(f'File: {filenames[i]}')

plt.tight_layout()
plt.show()

关键改动点

  • 移除了读取数据时的for x,y in data循环,每个文件的x/y数组只被添加一次到列表中。
  • 绘图时让子图索引和数据列表的索引一一对应,每个子图只绘制当前文件的数据集,而不是所有数据。

内容的提问来源于stack exchange,提问作者Angel Lira

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:24:51