使用 matplotlib 绘制日期时间输出
Plotting datetime output using matplotlib
所以我的代码基于一个简单的数据数组,如下所示:
5020 : 2015 7 11 11 42 54 782705
5020 : 2015 7 11 11 44 55 575776
5020 : 2015 7 11 11 46 56 560755
5020 : 2015 7 11 11 48 57 104872
情节如下所示:
import scipy as sp
import matplotlib.pyplot as plt
data = sp.genfromtxt("E:/Python/data.txt", delimiter=" : ")
x = data[:,0]
y = data[:,1]
plt.scatter(x,y)
plt.title("Instagram")
plt.xlabel("Time")
plt.ylabel("Followers")
plt.xticks([w*2*60 for w in range(10)],
['2-minute interval %i'%w for w in range(10)])
plt.autoscale(tight=True)
plt.grid()
plt.show()
我正在寻找一种简单的方法来将日期时间输出用作图表上的 x 间隔,我想不出一种方法让它理解它,就是这样:
In [15]:sp.sum(sp.isnan(y))
Out[15]: 77
我猜是因为空格?我是 Python 的机器学习新手,请原谅我的无知。
非常感谢。
是的,这是因为空格。当您导入数据时,它会将 NaN
分配给您的 x 值。
试试这个,它有点长,但应该有用:
data = []
x=[]
y=[]
with open('data.txt', 'r') as f:
for line in f:
data.append(line.split(':'))
for i in data:
y.append(i[0])
x_old.append(i[1])
for t in x_old:
x.append(float(t[17:19]+'.'+t[20:])/60+int(t[14:16]))
由于空格,我不得不手动将数据转换为浮点数。我将秒+毫秒除以 60,然后加上分钟,因为我假设您只对此感兴趣(2 分钟间隔)。
如果格式做得更好,您可以使用 datetime
并更好地提取信息。例如:
my_time = datetime.strptime('2015 7 11 11 42 54.782705', '&Y &m %d %H:%M:%S.%f')
我会通过直接将 datetime.datetime 对象传递给 pyplot 来解决这个问题。这是一个简短的例子:
import datetime as dt
import matplotlib.pyplot as plt
import matplotlib
# Note: please figure out yourself the data input
x = [dt.datetime(2015,7,11,11,42,54),
dt.datetime(2015,7,11,11,44,56),
dt.datetime(2015,7,11,11,46,56),
dt.datetime(2015,7,11,11,48,57)]
#define the x limit:
xstart= dt.datetime(2015,7,11,11,40,54)
xstop = dt.datetime(2015,7,11,11,50,54)
y = [782705, 575776, 560755, 104872]
fig,ax= plt.subplots()
ax.scatter(x,y)
xfmt = matplotlib.dates.DateFormatter('%D %H:%M:%S')
ax.xaxis.set_major_formatter(xfmt)
ax.set_title("Instagram")
ax.set_xlabel("Time")
ax.set_ylabel("Followers")
ax.set_xlim(xstart,xstop)
plt.xticks(rotation='vertical')
plt.show()
结果:
所以我的代码基于一个简单的数据数组,如下所示:
5020 : 2015 7 11 11 42 54 782705
5020 : 2015 7 11 11 44 55 575776
5020 : 2015 7 11 11 46 56 560755
5020 : 2015 7 11 11 48 57 104872
情节如下所示:
import scipy as sp
import matplotlib.pyplot as plt
data = sp.genfromtxt("E:/Python/data.txt", delimiter=" : ")
x = data[:,0]
y = data[:,1]
plt.scatter(x,y)
plt.title("Instagram")
plt.xlabel("Time")
plt.ylabel("Followers")
plt.xticks([w*2*60 for w in range(10)],
['2-minute interval %i'%w for w in range(10)])
plt.autoscale(tight=True)
plt.grid()
plt.show()
我正在寻找一种简单的方法来将日期时间输出用作图表上的 x 间隔,我想不出一种方法让它理解它,就是这样:
In [15]:sp.sum(sp.isnan(y))
Out[15]: 77
我猜是因为空格?我是 Python 的机器学习新手,请原谅我的无知。
非常感谢。
是的,这是因为空格。当您导入数据时,它会将 NaN
分配给您的 x 值。
试试这个,它有点长,但应该有用:
data = []
x=[]
y=[]
with open('data.txt', 'r') as f:
for line in f:
data.append(line.split(':'))
for i in data:
y.append(i[0])
x_old.append(i[1])
for t in x_old:
x.append(float(t[17:19]+'.'+t[20:])/60+int(t[14:16]))
由于空格,我不得不手动将数据转换为浮点数。我将秒+毫秒除以 60,然后加上分钟,因为我假设您只对此感兴趣(2 分钟间隔)。
如果格式做得更好,您可以使用 datetime
并更好地提取信息。例如:
my_time = datetime.strptime('2015 7 11 11 42 54.782705', '&Y &m %d %H:%M:%S.%f')
我会通过直接将 datetime.datetime 对象传递给 pyplot 来解决这个问题。这是一个简短的例子:
import datetime as dt
import matplotlib.pyplot as plt
import matplotlib
# Note: please figure out yourself the data input
x = [dt.datetime(2015,7,11,11,42,54),
dt.datetime(2015,7,11,11,44,56),
dt.datetime(2015,7,11,11,46,56),
dt.datetime(2015,7,11,11,48,57)]
#define the x limit:
xstart= dt.datetime(2015,7,11,11,40,54)
xstop = dt.datetime(2015,7,11,11,50,54)
y = [782705, 575776, 560755, 104872]
fig,ax= plt.subplots()
ax.scatter(x,y)
xfmt = matplotlib.dates.DateFormatter('%D %H:%M:%S')
ax.xaxis.set_major_formatter(xfmt)
ax.set_title("Instagram")
ax.set_xlabel("Time")
ax.set_ylabel("Followers")
ax.set_xlim(xstart,xstop)
plt.xticks(rotation='vertical')
plt.show()
结果: