Parece que tiene algunas series de fechas de inicio y de fecha de finalización.
En ese caso, simplemente use bar
para trazar cosas y diga a matplotlib que los ejes son fechas.
Para obtener los tiempos, puede explotar el hecho de que el formato de fecha interna de matplotlib es un flotante donde cada entero corresponde a 0:00 de ese día. Por lo tanto, para obtener los tiempos, podemos hacer times = dates % 1
.
Como un ejemplo (90% de esta es la generación y manipulación de fechas El trazado es sólo una sola llamada a 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()
# Make the default alignment center, unless specified otherwise
kwargs['align'] = kwargs.get('align', 'center')
# Convert things to matplotlib's internal date format...
starts, stops = mpl.dates.date2num(starts), mpl.dates.date2num(stops)
# Break things into start days and start times
start_times = starts % 1
start_days = starts - start_times
durations = stops - starts
start_times += int(starts[0]) # So that we have a valid date...
# Plot the bars
artist = ax.bar(start_days, durations, bottom=start_times, **kwargs)
# Tell matplotlib to treat the axes as dates...
ax.xaxis_date()
ax.yaxis_date()
ax.figure.autofmt_xdate()
return artist
def generate_data(start, stop):
"""Generate some random data..."""
# Make a series of events 1 day apart
starts = mpl.dates.drange(start, stop, dt.timedelta(days=1))
# Vary the datetimes so that they occur at random times
# Remember, 1.0 is equivalent to 1 day in this case...
starts += np.random.random(starts.size)
# Make some random stopping times...
stops = starts + 0.2 * np.random.random(starts.size)
# Convert back to datetime objects...
return mpl.dates.num2date(starts), mpl.dates.num2date(stops)
if __name__ == '__main__':
main()

En una nota lateral, para los eventos que comienza en un día y termina en el siguiente, esto extenderá el eje y al día siguiente. Puede manejarlo de otras maneras si lo prefiere, pero creo que esta es la opción más simple.
¡Eso es brillante Joe! Es exactamente lo que estaba buscando y usted dio un gran ejemplo de código. Gracias. – brice