我遇到了另外一个问题 - 我有多个文件格式如下:
Freq A B
1000 1.2 0.0014
100 1.2 0.00013
10 1.2 0.0012
所有文件都在同一个文件夹中;到目前为止,我能够读取所有文件,进行我想要的计算,然后保存一个包含所有所需数据的大文件(参见下面的代码)
在保存我想要的数据之前:
使用新数据将数据分成原始文件的数量,并使用与输入名称相同的名称(代码中的N是每个文件的行数,我使用它来识别如何我从总行数中得到的很多文件)
并且,为了在一个图中绘制所有不同的数据(假设我有3个像上面这样的文件,我想要一个带有3行的图,都在同一个图上) - 我似乎无法做到这一点我所有的尝试只给我一行
*更新 - 我可以读取数据,并在第一个循环中使用everithing,然后我可以查看所有数据 - 现在我想自动执行保存功能,但是代码(参见下面的简化版本)只保存一个数据集(可能会覆盖文本文件?) * 更新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
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))
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'))
感谢任何帮助/指导!
答案 0 :(得分: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不是常数,这个解决方案也会起作用(但你必须修改循环数据的方式)。
希望有所帮助!