Используя Matplotlib, как отобразить значения по оси Y, упорядоченные в формате HH24: MI - PullRequest
0 голосов
/ 02 апреля 2020

Я не могу отсортировать задание по окончанию sh времени (ось 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()

Спасибо

1 Ответ

0 голосов
/ 03 апреля 2020

Ваша проблема в том, что вы конвертируете в строку, поэтому по умолчанию ось Y представлена ​​в заданном порядке, а не отсортирована. Лучше работать с объектами datetime, и пусть matplotlib определит порядок оси y для вас. Чтобы сделать это, вам нужно преобразовать datetime в числа с плавающей точкой matplotlib, используя date2num :

from matplotlib.dates import date2num

yaxis1 = date2num(jobrunt1)
yaxis2 = date2num(jobrunt2)

, что даст вам следующее изображение:

enter image description here

Ось Y идет вверх в хронологическом порядке, хотя это трудно увидеть, поскольку отображается только время. Каждое 00:00 - это полночь нового дня, и между ними правильно расположены конечные sh времена. Однако я подозреваю, что вам нужно время по модулю даты; как будто каждый раз происходил в один и тот же день. Я думаю, что самый простой способ сделать это - просто заменить компонент даты повторяющимся днем:

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

Если все остальные коды совпадают, мы получим следующее:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...