在matplotlib中绘制日期与时间的关系图
我想要在图表上画出日期和一天中的时间,日期放在横轴,时间放在纵轴,然后可以选择用折线图或者浮动条图来展示。
不过,我的需求和那个图有些不同,我现在的纵轴上同时显示了日期和时间,这样就把几个月的时间戳挤在了一起,而我其实只需要一天的时间数据。那个例子里有人在评论中说“纵轴的基准日期可以是任何日期,因为信息在时间里”,但我不太明白他是怎么“丢掉”基准日期的信息的。
总之,我的需求是:
我希望纵轴可以选择24小时制(00:00到24:00)或者上午/下午制的时间格式,刻度显示像3:00pm、11:00am这样的样子。我想这可以用FuncFormatter来实现。
对于时间区间,我不想用误差条,因为那样的线太细了。我想用浮动条或者柱状图来展示。
我的数据是这种格式的日期时间字符串:'2010-12-20 05:00:00'
谢谢大家的帮助。
2 个回答
跟着Joe Kingston的回答,但我想补充一点,你需要把你的日期字符串转换成日期时间对象,这个可以很简单地通过datetime模块来实现,然后再把它们转换成matplotlib可以用的日期格式,表示为浮点数(这样你就可以根据需要进行格式化)。
import datetime as dt
import matplotlib as mpl
some_time_str = '2010-12-20 05:00:00'
some_time_dt = dt.datetime.strptime(some_time_str, '%Y-%m-%d %H:%M:%S')
some_time_num = mpl.dates.date2num(some_time_dt) # 734126.20833333337
如果你一开始有一个装满时间字符串的数组,你可以这样做:
time_str_list = ['2010-12-20 05:00:00','2010-12-20 05:30:00']
time_num_list = map(
lambda x: mpl.dates.date2num(dt.datetime.strptime(x, '%Y-%m-%d %H:%M:%S')),
time_str_list) #[734126.20833333337, 734126.22916666663]
我觉得你可能对matplotlib是怎么处理时间和日期的有点困惑。
在matplotlib中,所有的日期时间其实都是用简单的浮点数来表示的。比如说,1天就对应1.0的差值,而日期是从1900年开始计算的天数(我记得没错的话)。
所以,如果你想要只画出某个日期的时间,你需要用到% 1
。
我这里用的是点的形式,但你也可以很容易地用条形图。如果你用plt.bar
,可以看看bottom
这个参数,这样条形图的底部就会从你设定的时间开始(记得第二个参数是条形的高度,而不是它的顶部y值)。
举个例子:
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
import datetime as dt
# Make a series of events 1 day apart
x = mpl.dates.drange(dt.datetime(2009,10,1),
dt.datetime(2010,1,15),
dt.timedelta(days=1))
# Vary the datetimes so that they occur at random times
# Remember, 1.0 is equivalent to 1 day in this case...
x += np.random.random(x.size)
# We can extract the time by using a modulo 1, and adding an arbitrary base date
times = x % 1 + int(x[0]) # (The int is so the y-axis starts at midnight...)
# I'm just plotting points here, but you could just as easily use a bar.
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot_date(x, times, 'ro')
ax.yaxis_date()
fig.autofmt_xdate()
plt.show()
希望这能帮到你一点!