在 Matplotlib 中使用特定日期作为 X 轴绘制数据

152 阅读2分钟

很多时候,我们需要在图表中绘制数据,其中 X 轴是日期数据。默认情况下,Matplotlib 会将日期数据均匀分布在 X 轴上,同时使用点来绘制数据。但是,有时我们希望 X 轴上的日期与数据点一一对应,并且使用条形图或折线图来绘制数据。

huake_00198_.jpg 以下是一个示例代码,展示了如何使用 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 轴上,并且使用点来绘制数据。

  1. 解决方案

    要解决这个问题,我们可以使用 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()