从事件的开始到结束绘制一个时间矩形(yAxis)

时间:2019-01-31 03:44:01

标签: python matplotlib rectangles

首先,matplotlib的新手,从未尝试绘制矩形。 我的yAxis将显示时间(24小时),而xAxis将显示每个事件。我需要显示事件的开始时间(HH:MM)及其结束时间(HH:MM)。我已经看到了一些水平矩形和一些烛台图表(不确定是否对我有用)。每个xAxis矩形彼此都不相关。我可以通过从开始时间中减去结束时间来生成画布并创建经过时间,以在矩形上生成点,但是我无法使对象显示在图表上。有想法吗? 下面的代码:

from datetime import datetime, timedelta
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
import matplotlib.dates as mdates
from matplotlib.dates import HourLocator
from matplotlib.dates import DateFormatter

fig, ax = plt.subplots()


data = ["20180101T09:28:52.442130", "20180101T09:32:04.672891"]

endTime = datetime.strptime(data[1], "%Y%m%dT%H:%M:%S.%f")
beginTime = datetime.strptime(data[0], "%Y%m%dT%H:%M:%S.%f")

timeDiff = endTime - beginTime
elapseTime = timedelta(days=0, seconds=timeDiff.seconds,\
microseconds=timeDiff.microseconds)
print("elapseTime:", elapseTime)
theStartTime = endTime
theEndTime = theStartTime + elapseTime

# convert to matplotlib date representation
eventStart = mdates.date2num(theStartTime)
eventEnd = mdates.date2num(theEndTime)
eventTime = eventEnd - eventStart

# plot it as a Rectangle
nextEvent = Rectangle((1, eventStart), 1, eventTime, color="blue")
print("nextEvent:", nextEvent)

# locator = mdates.AutoDateLocator()
# locator.intervald[“MINUTELY”] = [0, 5, 10, 15, 20, 25, 30, 35, 40, 45,\   
#  50, 55]
# formatter = mdates.AutoDateFormatter[locator]
# formatter.scale[1/(24.*60.)] = “%M:%S”

timeFormat = mdates.DateFormatter("%H:%M")
ax.set_xlim([1, 5])
ax.yaxis_date()
ax.yaxis.set_major_formatter(timeFormat)
ax.set_ylim([datetime.strptime("23:59:59", "%H:%M:%S"),\ 
   datetime.strptime("00:00:00", "%H:%M:%S")])
ax.set_ylabel("Time(HH:MM)")
ax.set_xlabel("Events")
ax.add_patch(nextEvent)

plt.show()

enter image description here

我看不到数据,但是它是根据矩形对象的打印而出现的,它不适合画布。

我要实现的是下图(烛台演示) enter image description here

2 个答案:

答案 0 :(得分:0)

实际上,您的日期时间轴已完全关闭。它的范围从1900年1月1日的午夜到一分钟到1900年1月2日的午夜。然而,您的矩形是在2018年。

因此解决方案很简单,请在设置限制时包含完整的日期时间。

ax.set_ylim([datetime.strptime("20180101 23:59:59", "%Y%m%d %H:%M:%S"), 
             datetime.strptime("20180101 00:00:00", "%Y%m%d %H:%M:%S")])

或者将您的数据定义为发生在1900年。

答案 1 :(得分:0)

是的,这就是问题所在。设置画布限制时,我忽略了一些东西。