如何在Matplotlib子图中分离多文件数据并独立绘图?
解决Matplotlib子图重复显示相同内容的问题
嘿,我瞅了你的代码,发现问题出在数据收集和绘图循环的逻辑上——这才导致所有子图都长得一模一样。咱们拆解一下问题,再给你修正方案:
问题出在哪?
- 多余的嵌套循环导致数据重复收集:你在读取每个文件的数据后,又加了一层
for x,y in data循环,每次循环都把整个文件的x/y数组重新赋值并添加到xs和ys里。这意味着一个有N行数据的文件,会被重复添加N次到列表里,完全没必要。 - 绘图循环逻辑错误:第二个循环里,你对每个子图
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
相关产品推荐
相关产品推荐

