很多时候,我们需要在图表中绘制数据,其中 X 轴是日期数据。默认情况下,Matplotlib 会将日期数据均匀分布在 X 轴上,同时使用点来绘制数据。但是,有时我们希望 X 轴上的日期与数据点一一对应,并且使用条形图或折线图来绘制数据。
以下是一个示例代码,展示了如何使用 Matplotlib 绘制日期数据。
import datetime as DT
from matplotlib import pyplot as plt
data = [(DT.datetime.strptime('2010-02-05', "%Y-%m-%d"), 123),
(DT.datetime.strptime('2010-02-19', "%Y-%m-%d"), 678),
(DT.datetime.strptime('2010-03-05', "%Y-%m-%d"), 987),
(DT.datetime.strptime('2010-03-19', "%Y-%m-%d"), 345)]
x = [date for (date, value) in data]
y = [value for (date, value) in data]
fig = plt.figure()
graph = fig.add_subplot(111)
graph.plot_date(x,y)
plt.show()
运行上面的代码,你会发现 Matplotlib 将日期数据均匀分布在 X 轴上,并且使用点来绘制数据。
-
解决方案
要解决这个问题,我们可以使用 Matplotlib 的 DateLocator 和 DateFormatter 来设置 X 轴的刻度和标签。
DateLocator 可以控制 X 轴的刻度位置,而 DateFormatter 可以控制 X 轴标签的格式。
以下是一个修改后的代码示例,展示了如何使用 DateLocator 和 DateFormatter 来绘制日期数据。
import datetime as DT from matplotlib import pyplot as plt from matplotlib.dates import DateLocator, DateFormatter data = [(DT.datetime.strptime('2010-02-05', "%Y-%m-%d"), 123), (DT.datetime.strptime('2010-02-19', "%Y-%m-%d"), 678), (DT.datetime.strptime('2010-03-05', "%Y-%m-%d"), 987), (DT.datetime.strptime('2010-03-19', "%Y-%m-%d"), 345)] x = [date for (date, value) in data] y = [value for (date, value) in data] fig = plt.figure() graph = fig.add_subplot(111) # 设置 X 轴的刻度位置 graph.xaxis.set_major_locator(DateLocator()) # 设置 X 轴的标签格式 graph.xaxis.set_major_formatter(DateFormatter("%Y-%m-%d")) # 绘制数据 graph.plot(x,y,'r-o') plt.show()运行上面的代码,你会发现 Matplotlib 将日期数据一一对应地绘制在 X 轴上,并且使用折线图来绘制数据。
如果你希望使用条形图来绘制数据,你可以使用 plt.bar() 函数。
import datetime as DT from matplotlib import pyplot as plt from matplotlib.dates import DateLocator, DateFormatter data = [(DT.datetime.strptime('2010-02-05', "%Y-%m-%d"), 123), (DT.datetime.strptime('2010-02-19', "%Y-%m-%d"), 678), (DT.datetime.strptime('2010-03-05', "%Y-%m-%d"), 987), (DT.datetime.strptime('2010-03-19', "%Y-%m-%d"), 345)] x = [date for (date, value) in data] y = [value for (date, value) in data] fig = plt.figure() graph = fig.add_subplot(111) # 设置 X 轴的刻度位置 graph.xaxis.set_major_locator(DateLocator()) # 设置 X 轴的标签格式 graph.xaxis.set_major_formatter(DateFormatter("%Y-%m-%d")) # 绘制数据 graph.bar(x,y) plt.show()