关于numpy:从txt文件绘制简单图形python

Plotting simple graph python, from txt file

我试图剥离并获取.txt文件中的数据,以使我能够绘制简单的图形,但是我似乎无法将数据转换成我想要的格式。有人可以指引我正确的方向吗?

下面是文本文件中数据的简短示例,在python中,我试图对文本文件进行.read(),然后绘制一个简单的图形,并在可能的情况下使用文本文件中的标题。 >

1
2
3
4
5
6
7
8
9
10
11
12
Date,Value
2016-03-31,0.7927
2016-03-30,0.7859    
2016-03-29,0.7843  
2016-03-24,0.7893    
2016-03-23,0.792    
2016-03-22,0.7897    
2016-03-21,0.7818    
2016-03-18,0.778    
2016-03-17,0.781    
2016-03-16,0.7855  
2016-03-15,0.7845

到目前为止我尝试过的我的python代码:(这不是完美的代码,因为我仍在对其进行排序!)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import numpy as np
import matplotlib.pyplot as plt


with open("EURGBP DATA.txt") as f:
data = f.read()

data = data.split('\
'
)

x = [row.split()[0] for row in data]
y = [row.split()[1] for row in data]

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

fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.set_title("Plot DAta")    
ax1.set_xlabel('x')
ax1.set_ylabel('y')
ax1.set_xticklabels(x)
ax1.plot(index ,y, c='r', label='the data')
leg = ax1.legend()
plt.locator_params(nbins=len(index)-1)
plt.show()

对于大pandas(我在下面使用import pandas as pd),实际上可以用一行完成:

1
 pd.read_table('datafile.txt', parse_dates = True, index_col = 0, sep = ',').plot()

其中parse_dates关键字告诉pandas尝试将索引转换为日期时间。结果看起来像这样:
enter image description here


pandas中的DataFrame对象已经具有一个非常有用的功能plot()。将您的示例复制到剪贴板中,我可以执行以下操作:

1
2
3
4
5
6
7
8
import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_clipboard(delimiter=',')
df.plot()
ax = plt.gca()
ax.set_xticklabels(df.Date)
plt.savefig(filename='test.png')


这些行将数据行分隔为空格而不是逗号:

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

您需要指定要分割的字符(空白字符是默认字符):

1
2
x = [row.split(',')[0] for row in data]
y = [row.split(',')[1] for row in data]

编辑:附加数据清理

如果数据文件末尾有换行符,则

1
y = [row.split(',')[1] for row in data]

将引发IndexError,因为结尾的换行行将没有第二个元素:

1
2
3
4
5
6
7
8
9
10
>>> data = 'a,b\
c,d\
'
.split('\
'
)
>>> print(data)
['a,b', 'c,d', '']
>>> print(data[0].split(','))
['a', 'b']
>>> print(data[-1].split(','))
['']

通过在拆分值之前测试行不是空字符串来防御此问题:

1
2
x = [row.split(',')[0] for row in data if row]
y = [row.split(',')[1] for row in data if row]

您还需要从传递给matplotlib的值中删除列标题名称。通过在创建x和y值时省略第一行来做到这一点:

1
2
3
4
5
6
7
8
9
10
11
12
13
>>> data = 'First,Second\
a,b\
c,d\
'
.split('\
'
)
>>> print(data)
['First,Second', 'a,b', 'c,d', '']
>>> x = [row.split(',')[0] for row in data[1:] if row]
>>> print(x)
['a', 'c']
>>> y = [row.split(',')[1] for row in data[1:] if row]
>>> print(y)
['b', 'd']