It looks like you have some serial dates and a delay time.
In this case, just use barto plot and tell matplotlib that the axes are dates.
To get the time, you can use the fact that the matplotlib internal date format is a floating point, where each integer corresponds to 0:00 of that day. Therefore, to get time, we can just do times = dates % 1.
As an example (90% of this is date generation and processing. Bookmarking is just one call bar.):
import datetime as dt
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
def main():
start, stop = dt.datetime(2012,3,1), dt.datetime(2012,4,1)
fig, ax = plt.subplots()
for color in ['blue', 'red', 'green']:
starts, stops = generate_data(start, stop)
plot_durations(starts, stops, ax, facecolor=color, alpha=0.5)
plt.show()
def plot_durations(starts, stops, ax=None, **kwargs):
if ax is None:
ax = plt.gca()
kwargs['align'] = kwargs.get('align', 'center')
starts, stops = mpl.dates.date2num(starts), mpl.dates.date2num(stops)
start_times = starts % 1
start_days = starts - start_times
durations = stops - starts
start_times += int(starts[0])
artist = ax.bar(start_days, durations, bottom=start_times, **kwargs)
ax.xaxis_date()
ax.yaxis_date()
ax.figure.autofmt_xdate()
return artist
def generate_data(start, stop):
"""Generate some random data..."""
starts = mpl.dates.drange(start, stop, dt.timedelta(days=1))
starts += np.random.random(starts.size)
stops = starts + 0.2 * np.random.random(starts.size)
return mpl.dates.num2date(starts), mpl.dates.num2date(stops)
if __name__ == '__main__':
main()

On a side note, for events starting on one day and ending on the next, this will extend the y axis the next day. You can handle it in other ways if you want, but I think this is the easiest option.