Skip to main content
 首页 » 编程设计

python之使用 python 保存和绘制多个数据集

2025年05月04日11Leo_wl

我又遇到了一个问题 - 我有多个格式如下的文件:

频率 A B

1000 1.2 0.0014

100 1.2 0.00013

10 1.2 0.0012

所有文件都在同一个文件夹中;到目前为止,我能够读取所有文件,进行我想要的计算,然后保存一个包含所有需要数据的大文件(代码见下文)

在我保存我想要的数据之前:

将数据分解为原始文件的数量,用新数据,并使用与输入名称相同的名称(代码中的 N 是每个文件的行数,我用它来识别如何我从总行数中得到的很多文件)

并且,要在一个图中绘制所有不同的数据(假设我有 3 个像上面这样的文件,我想要一个有 3 条线的图,都在同一个图上)——我似乎无法做到这一点,因为我所有的尝试都只给我一行

* 更新 - 我可以读取数据,并将所有内容放在第一个循环中,然后我可以遍历所有数据 - 现在我想自动保存功能,但是代码(见下面的简化版本)只保存一个数据集(可能会覆盖文本文件?) * 更新 2 - 现在可以使用了 - 需要在第二个循环中添加保存功能

import os 
import numpy as np 
 
datadirectory = '/media/data' 
os.chdir( datadirectory) 
 
listing = os.listdir(datadirectory)  
my_array=np.zeros(shape=(0,3)) 
 
for infile in listing:  
   dataset = open(infile).readlines() 
   data = np.genfromtxt(dataset, usecols=(0,1,2)) 
   my_array = np.vstack((my_array, data)) 
   lta= my_array 

此处进行一些处理 - lta 现在有 5 列

   Results=np.column_stack((lta[:,0], lta[:,1], lta[:,2], lta[:,3], lta[:,4])) 
   for i in listing: 
       date = i 
       np.savetxt((os.path.join(resultpath, date)) + '.txt', Results, fmt='%s', delimiter='\t')  
   my_array = np.vstack((my_array, Results)) 

绘制数据 - 在 my_array 数组中我有所有数据,每 N 行(给定数字)我有一个不同的数据集 - 我想在同一个图表中绘制所有数据,我想每 N 行更改符号颜色

import matplotlib.pylab as plt 
 
plt.figure(figsize=(10,5)) 
#graph_axes = plt.subplot(N,2,1) 
graph = plt.semilogx(my_array[:,0], my_array[:,2]) 
plt.ylim(0, 25) 
plt.xlim(0.1, 1000) 
plt.show() 
plt.savefig(os.path.join(resultpath, 'image.png')) 

感谢任何帮助/指导!

请您参考如下方法:

如果您能提供my_array 中内容的示例就更好了,但据我了解,这段代码可以帮助您实现您的需要。首先,这是我为伪造数据而编写的代码。

import numpy as np 
from random import random 
 
# generate fake data 
num_files = 5 
N = 20 
my_array = [] 
for f in range(num_files):  # simulate multiple files 
    for n in range(N):  # simulate multiple samples per file 
        # fake data 
        my_array.append([10 ** n / N, random() + f, 10 + f + random()]) 
my_array = np.asarray(my_array) 

希望此时 my_array 的内容与您所拥有的内容相似(我只模拟了 3 列而不是处理数据后的 5 列,但这不应该影响后面的绘图代码:

import matplotlib.pyplot as plt 
 
# now plot it 
for i in range(0, num_files * N, N): 
    # plot column-0 vs column-1 in one subplot 
    plt.subplot(2, 1, 1) 
    plt.semilogx(my_array[i:i + N, 0], my_array[i:i + N, 1]) 
    plt.hold(True) 
    # plot column-0 vs column-2 in another subplot 
    plt.subplot(2, 1, 2) 
    plt.semilogx(my_array[i:i + N, 0], my_array[i:i + N, 2]) 
    plt.hold(True) 
plt.show() 

诀窍是使用 plt.hold(True),它将保留之前绘制的任何内容,并为下一个要绘制的数据分配新颜色。如果 N 不是常量,此解决方案也适用(但您必须修改循环数据的方式)。

希望对您有所帮助!