Mat*_*att 42 python matplotlib
我想用python的matplotlib模块制作一个通用值-vs-时间图.我的时间是在unix时间,但我希望它们在图的x轴上以可读格式显示.
我已经阅读了关于使用datetime对象进行绘图的答案,但是这种方法似乎可以删除小时/分钟/秒信息并将时间戳记移动到一整天.有没有办法生成这些图并显示更细粒度的标签?
unu*_*tbu 69
它可以调用plt.plot(dates,values)
与dates
被列表datetime.datetime
对象.该图将包括xticks的格式'%Y-%m-%d'
和放大时的格式,自动更改为显示小时,分钟,秒的格式.
然而,听起来你需要更多的控制权.也许它没有显示你想要的规模的小时,分钟,秒.
在这种情况下,您可以设置自己的日期格式化程序:
ax=plt.gca()
xfmt = md.DateFormatter('%Y-%m-%d %H:%M:%S')
ax.xaxis.set_major_formatter(xfmt)
Run Code Online (Sandbox Code Playgroud)
不幸的是,如果你传递datetime.datetime
对象plt.plot
,matplotlib自动选择的xticks似乎总是有秒等于零.例如,如果你跑
import matplotlib.pyplot as plt
import matplotlib.dates as md
import numpy as np
import datetime as dt
import time
n=20
duration=1000
now=time.mktime(time.localtime())
timestamps=np.linspace(now,now+duration,n)
dates=[dt.datetime.fromtimestamp(ts) for ts in timestamps]
values=np.sin((timestamps-now)/duration*2*np.pi)
plt.subplots_adjust(bottom=0.2)
plt.xticks( rotation=25 )
ax=plt.gca()
xfmt = md.DateFormatter('%Y-%m-%d %H:%M:%S')
ax.xaxis.set_major_formatter(xfmt)
plt.plot(dates,values)
plt.show()
Run Code Online (Sandbox Code Playgroud)
然后你得到格式很好的日期,但所有的xtick秒都是零.
那么解决方案是什么?
如果您自己转换时间戳 - > datetime.datetime对象 - > matplotlib datenums,并将datenums传递给plt.plot
,则保留秒数.
PS."matplotlib datenum"是指返回的数字matplotlib.dates.date2num
.
import matplotlib.pyplot as plt
import matplotlib.dates as md
import numpy as np
import datetime as dt
import time
n=20
duration=1000
now=time.mktime(time.localtime())
timestamps=np.linspace(now,now+duration,n)
dates=[dt.datetime.fromtimestamp(ts) for ts in timestamps]
datenums=md.date2num(dates)
values=np.sin((timestamps-now)/duration*2*np.pi)
plt.subplots_adjust(bottom=0.2)
plt.xticks( rotation=25 )
ax=plt.gca()
xfmt = md.DateFormatter('%Y-%m-%d %H:%M:%S')
ax.xaxis.set_major_formatter(xfmt)
plt.plot(datenums,values)
plt.show()
Run Code Online (Sandbox Code Playgroud)