如何使用matplotlib在x轴绘制特定日期的数据
我有一组数据,里面是日期和对应的数值。我想把这些数据画成一个柱状图,日期放在横轴上。
我遇到的问题是,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
表示),我想做以下几件事:
- 让横轴的刻度对应到确切的日期值。我听说过
matplotlib.dates.DateLocator
,但我不知道怎么创建一个并把它和特定的Axes
对象关联起来。 - 更好地控制图表的类型(柱状图、折线图、点图等)。
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