python - 使用 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()
谢谢
解决方案
您的问题是您正在转换为字符串,因此默认情况下 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])
所有其他代码都相同,我们得到:
推荐阅读
- python - 如何在 Python 上将列表的所有值导出到 csv
- sql - 分组并仅在组中唯一时提供组
- bash - 如何解决与 rbenv 相关的终端错误/消息
- r - 为什么使用插入符号对数据进行预处理,编码为非表格对象
- android - 如何使用异步返回字符串
- c++ - 链表节点类 C++ 中的清除函数
- azure - 如何为 Azure Linux 服务 Web 应用设置加密
- javascript - 如何在不重新加载页面的情况下提交 asp.net core razor pages 表单
- java - 打破 hasNext 循环
- python - 在类中定义函数(而不是方法)的最佳方法是什么?