1

我正在尝试绘制一个以日期为 x 轴的图表。这绘制得很好,但刻度线与数据点不对齐。

from datetime import datetime
import pylab as p
from matplotlib.dates import date2num, num2date

scores = [
        (datetime.strptime("2013-08-07T14:00", "%Y-%m-%dT%H:%M"), 1280),
        (datetime.strptime("2013-08-07T15:00", "%Y-%m-%dT%H:%M"), 1272),
        (datetime.strptime("2013-08-07T16:00", "%Y-%m-%dT%H:%M"), 1252),
        (datetime.strptime("2013-08-07T17:00", "%Y-%m-%dT%H:%M"), 1293),
        (datetime.strptime("2013-08-07T18:00", "%Y-%m-%dT%H:%M"), 1258),
        (datetime.strptime("2013-08-07T19:00", "%Y-%m-%dT%H:%M"), 1240),
        (datetime.strptime("2013-08-07T20:00", "%Y-%m-%dT%H:%M"), 1287),
        (datetime.strptime("2013-08-07T21:00", "%Y-%m-%dT%H:%M"), 1241),
        (datetime.strptime("2013-08-07T22:00", "%Y-%m-%dT%H:%M"), 1286),
        (datetime.strptime("2013-08-07T23:00", "%Y-%m-%dT%H:%M"), 1237),
        (datetime.strptime("2013-08-08T00:00", "%Y-%m-%dT%H:%M"), 1269),
        (datetime.strptime("2013-08-08T01:00", "%Y-%m-%dT%H:%M"), 1269),
        (datetime.strptime("2013-08-08T02:00", "%Y-%m-%dT%H:%M"), 1258),
        (datetime.strptime("2013-08-08T03:00", "%Y-%m-%dT%H:%M"), 1259),
        (datetime.strptime("2013-08-08T04:00", "%Y-%m-%dT%H:%M"), 1265),
        (datetime.strptime("2013-08-08T05:00", "%Y-%m-%dT%H:%M"), 1225),
        (datetime.strptime("2013-08-08T06:00", "%Y-%m-%dT%H:%M"), 1251),
        (datetime.strptime("2013-08-08T07:00", "%Y-%m-%dT%H:%M"), 1297),
        (datetime.strptime("2013-08-08T08:00", "%Y-%m-%dT%H:%M"), 1244),
        (datetime.strptime("2013-08-08T09:00", "%Y-%m-%dT%H:%M"), 1283),
        (datetime.strptime("2013-08-08T10:00", "%Y-%m-%dT%H:%M"), 1253),
        (datetime.strptime("2013-08-08T11:00", "%Y-%m-%dT%H:%M"), 1305),
        (datetime.strptime("2013-08-08T12:00", "%Y-%m-%dT%H:%M"), 1284),
        (datetime.strptime("2013-08-08T13:00", "%Y-%m-%dT%H:%M"), 1318),
        (datetime.strptime("2013-08-08T14:00", "%Y-%m-%dT%H:%M"), 454),
    ]

if __name__ == "__main__":
    fig = p.figure()
    ax = fig.add_subplot(1,1,1)
    x = [date2num(date) for (date, value) in scores]
    y = [value for (date, value) in scores]
    ax.plot(x, y, 'r-x')
    ticks = [num2date(t) for t in x[0::4]]
    ax.set_xticklabels([t.strftime("%H:%M") for t in ticks], rotation="45")
    p.savefig("line_plot.png")

这将生成以下图表作为其输出。

样本输出

第一个数据点应该从 14:00 开始,并且似乎已经过了 3 个小时。数据点之间的间距似乎是正确的,只是起始偏移量关闭了。有什么想法为什么要这样做?

更新: 根据似乎已被删除的评论,我查看了plot_date我设法以某种方式错过的方法......我现在将代码更改为以下内容。这给了我一个很好的图表,其中刻度在正确的位置。

if __name__ == "__main__":
    fig = p.figure()
    ax = fig.add_subplot(1,1,1)
    x = [date2num(date) for (date, value) in scores]
    y = [value for (date, value) in scores]
    ax.plot_date(x, y, 'r-x')
    fig.autofmt_xdate()
    p.savefig("line_plot.png")
4

1 回答 1

1

您已将 x 数据转换为 python 模块可以理解的一系列浮点数,datetime但是当将它们传递给p.plot(x, y)它时,只会看到一堆浮点数。然后,您实际上是在任意设置标签。

您应该使用ax.plot_date(x, y, 'r-x')which 接受 x 作为日期或浮点表示。您需要删除 x 标签的手动设置才能看到这一点。然后查看文档以了解如何自定义 x 轴的格式。

于 2013-08-08T15:46:19.063 回答