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

2 投票
1 回答
4152 浏览
提问于 2025-04-17 14:22

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

频率 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'))

任何帮助或指导都非常感谢!

1 个回答

0

如果你能提供一下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不是常量,这个方法也能用(不过你需要修改一下循环遍历数据的方式)。

希望这对你有帮助!

撰写回答