如何使用matplotlib在x轴绘制特定日期的数据

17 投票
1 回答
35174 浏览
提问于 2025-04-16 02:48

我有一组数据,里面是日期和对应的数值。我想把这些数据画成一个柱状图,日期放在横轴上。

我遇到的问题是,matplotlib 会把横轴的刻度分布在整个日期范围上,而且还用点来表示数据。

这些日期都是 datetime 对象。这里有一部分数据的示例:

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)]

下面是一个可以运行的代码示例,使用了 pyplot

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()

问题总结:
我的情况是,我已经有一个 Axes 实例(在上面的代码中用 graph 表示),我想做以下几件事:

  1. 让横轴的刻度对应到确切的日期值。我听说过 matplotlib.dates.DateLocator,但我不知道怎么创建一个并把它和特定的 Axes 对象关联起来。
  2. 更好地控制图表的类型(柱状图、折线图、点图等)。

1 个回答

31

你现在做的事情其实很简单,直接用 plot 就可以了,不需要用 plot_date。plot_date 适合处理更复杂的情况,但你现在需要的功能用 plot 就能轻松搞定。

比如,基于你上面的例子:

import datetime as DT
from matplotlib import pyplot as plt
from matplotlib.dates import date2num

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 = [date2num(date) for (date, value) in data]
y = [value for (date, value) in data]

fig = plt.figure()

graph = fig.add_subplot(111)

# Plot the data as a red line with round markers
graph.plot(x,y,'r-o')

# Set the xtick locations to correspond to just the dates you entered.
graph.set_xticks(x)

# Set the xtick labels to correspond to just the dates you entered.
graph.set_xticklabels(
        [date.strftime("%Y-%m-%d") for (date, value) in data]
        )

plt.show()

如果你想要一个柱状图,只需使用 plt.bar()。想了解如何设置线条和标记的样式,可以查看 plt.plot()这里有一个带日期标签的图示,展示了标记位置 http://www.geology.wisc.edu/~jkington/matplotlib_date_labels.png

撰写回答