Построить столбчатую диаграмму с временем по оси y
Из своей программы выделил этот кусок для описания проблемы:
Необходимо построить график с барами, где по оси 'y' отложено время от 00:00 до 23:59, 'x' -- условно имена людей в виде цифр (оси получились, см. первый скрин).
На графике должны корректно откладываться наборы временных отрезков, например,
- от 00:00 до 01:00, от 01:00 до 12:00 для "1",
- от 00:00 до 00:30, от 00:30 до 16:00 для "2"
Если раскомментировать последние строки с "plt.bar=", то получатся такие ошибки:
ВОПРОС: Объясните, пожалуйста, как и в каком формате задавать наборы данных для 'y', чтобы они отображались правильно?
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from datetime import timedelta
fig, ax = plt.subplots()
min_lim = np.datetime64('2005-02-03 00:00')
max_lim = np.datetime64('2005-02-03 23:59')
lims = (min_lim, max_lim)
plt.ylim(lims)
hours = mdates.HourLocator(interval=1)
h_fmt = mdates.DateFormatter('%H:%M')
ax.yaxis.set_major_locator(hours)
ax.yaxis.set_major_formatter(h_fmt)
plt.xlim(-0.5, 3.5)
x = np.arange(1, 2)
y11 = timedelta(hours=2, minutes=30)
y12 = timedelta(hours=2, minutes=0)
y21 = timedelta(hours=1, minutes=30)
y22 = timedelta(hours=3, minutes=0)
series1=[y11, y12]
series2=[y21, y22]
#plt.bar(x, series1, color='r', bottom=0)
#plt.bar(x, series2, color='g', bottom=series1)
plt.show()
Сразу говорю, я прогуглил весь интернет. С matplotlib'ом и его непонятной документацией у меня дикие проблемы, особенно после qt (где все чудесно понятно, спасибо QtРебята!).
ДУБЛИРУЮ ВОПРОС:
ВОПРОС: Объясните, пожалуйста, как и в каком формате задавать наборы данных для 'y', чтобы они отображались правильно?
Ответы (1 шт):
Вам нужно сначала привести ваши timedelta в формат datetime, чтобы matplotlib мог с ними работать. В вашем конкретном примере можно сделать так:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from datetime import timedelta, datetime
fig, ax = plt.subplots()
min_lim = np.datetime64('2005-02-03 00:00')
max_lim = np.datetime64('2005-02-03 23:59')
lims = (min_lim, max_lim)
plt.ylim(lims)
hours = mdates.HourLocator(interval=1)
h_fmt = mdates.DateFormatter('%H:%M')
ax.yaxis.set_major_locator(hours)
ax.yaxis.set_major_formatter(h_fmt)
plt.xlim(-0.5, 3.5)
x = np.arange(1, 2)
y11 = min_lim.astype(datetime) + timedelta(hours=2, minutes=30)
y12 = y11 + timedelta(hours=2, minutes=0)
y21 = min_lim.astype(datetime) + timedelta(hours=1, minutes=30)
y22 = y21 + timedelta(hours=3, minutes=0)
series1=[y11, y12]
series2=[y21, y22]
plt.bar([1,2], [series1[1], series2[1]], color='g')
plt.bar([1,2], [series1[0], series2[0]], color='r')
plt.show()
получите, соответственно:


