首页 > 解决方案 > 使用 Matplotlib,如何显示以 HH24:MI 格式排序的 Y 轴值

问题描述

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

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

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()

谢谢

标签: pythonpandasmatplotlib

解决方案


您的问题是您正在转换为字符串,因此默认情况下 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])

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

在此处输入图像描述


推荐阅读