Matplotlib 处理日期

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自动管理刻度,尤其是刻度的标签,其后果无疑是一场灾难。以这种方式显示日期时,可读性很差,两个数据点之间的时间间隔不清晰,并且还存在重影现象。

解决方案

我们需要用合适的对象定义时间尺度来管理日期,首先需要导入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()

输出结果如下:
Matplotlib 处理日期

有时候日期时间太长,需要旋转才能生效,注意每个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 添加网格
Matplotlib 添加文本

赞(6)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址