【问题标题】:Using Matplotlib, how to display Y-axis values ordered in HH24:MI format使用 Matplotlib,如何显示以 HH24:MI 格式排序的 Y 轴值
【发布时间】:2020-04-03 05:09:02
【问题描述】:

我无法对作业完成时间(Y 轴)进行排序。目前它正在显示每个 Y 轴的内容。将来我会添加更多的 Y 轴。

有没有办法对 Y 轴值进行排序?我的示例代码粘贴在下面,并附上了问题的屏幕截图。 Screenshot attached

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

xaxis =[ \[][1]
            DT.datetime(2020, 3, 19, 0, 0),
            DT.datetime(2020, 3, 20, 0, 0),
            DT.datetime(2020, 3, 23, 0, 0),
            DT.datetime(2020, 3, 24, 0, 0)
        ]
jobrunt1 = [DT.datetime(2020, 3, 20, 6, 39, 0),
            DT.datetime(2020, 3, 23, 15, 59, 24),
            DT.datetime(2020, 3, 24, 6, 37, 4),
            DT.datetime(2020, 3, 25, 6, 38, 0)]

jobrunt2 = [DT.datetime(2020, 3, 20, 8, 40, 0),
            DT.datetime(2020, 3, 23, 18, 19, 24),
            DT.datetime(2020, 3, 24, 4, 39, 4),
            DT.datetime(2020, 3, 25, 1, 20, 8)]

yaxis1 = [DT.datetime.strftime(y, "%H:%M") for y in jobrunt1]
yaxis2 = [DT.datetime.strftime(z, "%H:%M") for z in jobrunt2]

f, ax = plt.subplots(figsize=(12, 4))
ax.xaxis.set_major_formatter(DateFormatter('%d/%m/%Y'))
ax.yaxis.set_minor_formatter(DateFormatter('%H:%M'))
ax.set_xlabel('Rundt')
ax.set_ylabel('Job Finish Time')
ax.plot(xaxis, yaxis1, marker='o', label='Job1')
ax.plot(xaxis, yaxis2, marker='^', label='Job2')
plt.show()

谢谢

【问题讨论】:

    标签: python pandas matplotlib


    【解决方案1】:

    您的问题是您正在转换为字符串,因此默认情况下 y 轴按给定顺序显示,而不是排序。最好使用 datetime 对象,让 matplotlib 为您计算 y 轴顺序。为此,您需要使用 date2num 将日期时间转换为 matplotlib 的日期时间浮点数:

    from matplotlib.dates import date2num
    
    yaxis1 = date2num(jobrunt1)
    yaxis2 = date2num(jobrunt2)
    

    这会给你这个图像:

    y 轴按时间顺序上升,虽然很难看到,因为只显示时间。每个00:00 是新一天的午夜,并且完成时间正确放置在它们之间。但是我怀疑您想要的是以日期为模的时间;仿佛每次都发生在同一天。我认为最简单的方法就是用重复的日期替换日期组件:

    test_day = DT.date(2020, 3, 20)
    yaxis1 = date2num([DT.datetime.combine(test_day, t.time()) for t in jobrunt1])
    yaxis2 = date2num([DT.datetime.combine(test_day, t.time()) for t in jobrunt2])
    

    所有其他代码都相同,我们得到这个:

    【讨论】:

    • 嗨,乔希,我用您提供的最后三行替换了我的版本中的第 18 行和第 19 行。包括(从 matplotlib.dates 导入 date2num)。但是我看到的 Y 轴值是 0.1、0.2、0.3、0.4、0.5、0.6 和 0.7。艾米,我漏掉了其他台词吗?
    • 我添加了以下几行并且它有效。 yaxis1 = [num2date(t) for t in yaxis1] yaxis2 = [num2date(t) for t in yaxis2] 。我觉得很好
    • 很好,如果有帮助,请将答案(可能还有前一个?)标记为“已接受”(绿色检查)!
    猜你喜欢
    • 2020-07-10
    • 2018-06-12
    • 2022-12-21
    • 1970-01-01
    • 2021-03-22
    • 2019-05-27
    • 2016-06-07
    • 1970-01-01
    相关资源
    最近更新 更多