【问题标题】:time format of xaxis does not change correctly on pandas' plotxaxis 的时间格式在 pandas 的绘图上没有正确更改
【发布时间】:2016-03-24 01:35:21
【问题描述】:

我想将 pandas DataFrame 绘制为 x 轴为 '%H:%M' 样式的折线图。

但是,当我尝试这个时:

import datetime
import pandas as pd
import numpy as np
d = pd.DataFrame([np.random.rand(3) for _ in range(9)])
d.index = [datetime.time(i, 0) for i in range(15,24)]
ax = d.plot(xticks=d.index)
plt.xticks([x.strftime("%H:%M") for x in d.index][0::4])

绘制带有 %H:%M:%s 样式 x 轴的图表:

在这个answer之后,我添加了DateFormatter

import matplotlib.dates as md
d = pd.DataFrame([np.random.rand(3) for _ in range(9)])
d.index = [datetime.time(i, 0) for i in range(15,24)]
ax = d.plot(xticks=d.index)
#plt.xticks([x.strftime("%H:%M") for x in d.index][0::4])
ax.xaxis.set_major_formatter(md.DateFormatter('%H:%M'))

不幸的是,我得到了一个只有 00:00 x 轴的图。

我想获得带有适当间隔刻度标签的 %H:%M 样式 x 轴,例如“15:00、17:00、19:00、21:00”(此处每 2 个间隔)。我是如何意识到这一点的?

【问题讨论】:

    标签: python pandas matplotlib plot


    【解决方案1】:

    我相信这是因为 DateFormatting 无法识别“%H:%M”的说明。只需用整数指令%d 替换它们,它就会给你想要的结果(或者至少是你可以适应的结果)。在您的代码的以下修复中,我还为标签添加了旋转以避免 x 轴过度混乱:

    import datetime
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.dates as md
    d = pd.DataFrame([np.random.rand(3) for _ in range(9)])
    d.index = [datetime.time(i, 0) for i in range(15,24)]
    ax = d.plot(xticks=d.index)
    plt.xticks(rotation=45)  # Changed here
    ax.xaxis.set_major_formatter(md.DateFormatter('%d:%d')) # and here...
    plt.show()
    

    编辑:上面的示例仅更改格式化程序的解释器字符串。我没有弄乱数据或其他任何东西。在任何情况下,理想情况下你应该使用这个:

    ax.xaxis.set_major_locator(md.HourLocator(byhour=range(0,24,2)))
    

    ,实现你想要的。但是我刚刚测试了它,它似乎有一个错误。话虽如此,我的建议是您将所需的标签直接解析到 xticks 中。

    import datetime
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    d = pd.DataFrame([np.random.rand(3) for _ in range(9)])
    d.index = [datetime.time(i, 0).hour for i in range(15,24)]
    ax = d.plot(xticks=d.index)
    plt.xticks([datetime.time(i, 0).hour for i in range(15,24)][0::2],["%d:00"%datetime.time(i, 0).hour for i in range(15,24)][0::2],rotation=45)  # Changed here
    plt.show()
    

    ,结果如下:

    【讨论】:

    • 我刚刚改变了我认为是您最紧迫的问题:无论位置如何,您的标签都归零(其余的我认为您会适应)。仅仅因为它没有提供复制粘贴解决方案而否决答案似乎是 SO 的新趋势。我个人觉得很遗憾,但我想就是这样。我已经编辑了帖子,为您的问题提供了可能的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    • 2017-03-21
    • 2020-11-22
    • 2012-05-18
    • 1970-01-01
    相关资源
    最近更新 更多