关于从txt文件数据进行绘图的问题

时间:2018-09-21 14:03:21

标签: python matplotlib

txt文件中绘制数据时存在问题。 txt文件中有7列,我想使用最后一列和第三列中的数据(分别作为x轴和y轴),但是该命令不起作用。

错误是:

x = [row.split()[6] for row in data]
> IndexError: list index out of range

我的代码是:

x = [row.split()[6] for row in data]
y = [row.split()[2] for row in data]

index = [i for i,val in enumerate(x)]

fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.set_xticklabels(x)
ax1.plot(index ,y, c='r')
leg = ax1.legend()
plt.locator_params(nbins=len(index)-1)
plt.show()

这是我的txt文件的一部分。

01.05.2016  00:01:00    313 U   42491,00069 -1,87   01.05.2016 00:02

01.05.2016  00:02:00    313 U   42491,00139 -1,87   01.05.2016 00:03

01.05.2016  00:03:00    313 U   42491,00208 -1,87   01.05.2016 00:04

如有必要,以下代码显示了如何初始化数据:

import matplotlib.pyplot as plt
with open("tesy=t.txt") as f:
    data = f.read()
    data = data.split('\n')

2 个答案:

答案 0 :(得分:1)

我在文件file.txt中使用了您的三行数据,根据您的描述,这是通过重写代码获得的图。您不需要名为index的其他变量来标记x标记。您可以直接绘制x,x-tick标签将自动设置。要访问最后一列,我正在使用索引[-1]。这样可以避免计算列数和手动放置索引。我删除了图例,因为在绘图命令中您没有定义图例。

file = open("file.txt", 'r')
data = file.readlines()
data[0].split()
x = [row.split()[-1] for row in data] # if no blank line in the file
y = [row.split()[2] for row in data] # if no blank line in the file
# x = [row.split()[-1] for row in data if row.strip()] # if blank lines in the file
# y = [row.split()[2] for row in data if row.strip()] # if blank lines in the file

index = range(len(x))
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.plot(x ,y, '-ro')

输出

enter image description here

答案 1 :(得分:0)

您可以尝试执行此操作,这应该适合您的文件,并逐行读取,然后从每行的最后一列中提取x值并将其附加到列表x中,然后从第三列中提取y值并将其附加到列表y 之后,您将保存所有数据(x和y)并列出,现在就可以绘图

x = []
y = []
filename = '/data.txt'

with open(filename) as f:
    x = [x.split(' ')[-1] for x in f.readlines()]
with open(filename) as f:
    y = [x.split(' ')[2] for x in f.readlines()]

这将导致一个包含带有\n的值的列表,该列表引用新行

为避免这种情况,您可以

x = []
y = []
filename = '/data.txt'

with open(filename) as f:
    x = [x.split(' ')[-1] for x in f.read().splitlines()]
with open(filename) as f:
    y = [x.split(' ')[2] for x in f.read().splitlines()]
print(x)
print(y)

plt.figure(1)
plt.plot(x, y, marker='o')
plt.show()

输出将为

['00:02', '00:03', '00:04']
['313', '313', '313']

enter image description here