Matplotlib 处理日期,数据分析过程中,最常见的一个问题就是日期类型数据的处理。matplotlib下的dates
模块主要用于处理日期,常用函数有MonthLocator()
,DayLocator()
,DateFormatter()
等等。
极客教程前面介绍了Matplotlib基础知识添加图例,添加网格,添加文本供给大家参考。
常见问题
在轴上(通常为x轴)显示日期,问题很多,尤其是用日期做标签时难以管理。如下所示,线型图表有八个数据点,我们按照日-月-年格式在x轴显示日期值。
import matplotlib.pyplot as plt
import datetime
events = [datetime.date(2015,1,23), datetime.date(2015,1,28), datetime.date(2015,2,3),
datetime.date(2015,2,21),datetime.date(2015,3,15),datetime.date(2015,3,24),
datetime.date(2015,4,8),datetime.date(2015,4,24)]
readings = [12, 22, 25, 20, 18, 15, 17, 14]
plt.plot(events, readings)
plt.title("geek-docs.com", fontsize=20, fontname="Times New Roman")
plt.show()
输出结果如下:
如上所示,如果让matplotlib
自动管理刻度,尤其是刻度的标签,其后果无疑是一场灾难。以这种方式显示日期时,可读性很差,两个数据点之间的时间间隔不清晰,并且还存在重影现象。
解决方案
我们需要用合适的对象定义时间尺度来管理日期,首先需要导入matplotlib.dates
模块,该模块专门用于管理日期类型的数据。我们用MonthLocator()
和DayLocator()
函数,分别表示月份和日期。
日期格式也很重要,要避免出现重影问题或显示无效的日期数据,只显示必要的刻度标签就好。我们这里只显示年月,把这种格式作为参数传给DateFormatter()
函数。
定义好两个时间尺度,一个用于日期,一个用于月份,你可以在xaxis
对象上调用set_major_locator()
函数和set_minor_locator()
函数,为x轴设置两种不同的标签。此外,月份刻度标签的设置,需要用到set_major_formatter()
函数。如下所示:
import matplotlib.pyplot as plt
import datetime
import matplotlib.dates as mdates
# 获取每月数据
months = mdates.MonthLocator()
# 获取每日数据
days = mdates.DayLocator()
events = [datetime.date(2015,1,23), datetime.date(2015,1,28), datetime.date(2015,2,3),
datetime.date(2015,2,21),datetime.date(2015,3,15),datetime.date(2015,3,24),
datetime.date(2015,4,8),datetime.date(2015,4,24)]
readings = [12, 22, 25, 20, 18, 15, 17, 14]
fig, ax = plt.subplots()
plt.plot(events, readings)
# 设定主/次刻度
ax.xaxis.set_major_locator(months)
ax.xaxis.set_minor_locator(days)
# 设定格式
timeFmt = mdates.DateFormatter('%Y-%m')
ax.xaxis.set_major_formatter(timeFmt)
plt.title("geek-docs.com", fontsize=20, fontname="Times New Roman")
plt.show()
输出结果如下:
有时候日期时间太长,需要旋转才能生效,注意每个axes都需要单独设定,如下所示:
import matplotlib.pyplot as plt
import datetime
import matplotlib.dates as mdates
# 获取每月数据
months = mdates.MonthLocator()
# 获取每日数据
days = mdates.DayLocator()
events = [datetime.date(2015,1,23), datetime.date(2015,1,28), datetime.date(2015,2,3),
datetime.date(2015,2,21),datetime.date(2015,3,15),datetime.date(2015,3,24),
datetime.date(2015,4,8),datetime.date(2015,4,24)]
readings = [12, 22, 25, 20, 18, 15, 17, 14]
fig, ax = plt.subplots()
plt.plot(events, readings)
# 设定主/次刻度
ax.xaxis.set_major_locator(months)
ax.xaxis.set_minor_locator(days)
# 设定格式
timeFmt = mdates.DateFormatter('%Y-%m-%d')
ax.xaxis.set_major_formatter(timeFmt)
plt.setp(ax.get_xticklabels(), rotation=15, horizontalalignment='right')
plt.title("geek-docs.com", fontsize=20, fontname="Times New Roman")
plt.show()
输出结果如下:
极客教程相关文章推荐:
Matplotlib 添加图例,
Matplotlib 添加网格,
Matplotlib 添加文本