plt.fill
basically links the first and last point of the time series to build its polygon. I would use fill_between instead.
I've put together a MWE below that shows how it can be done. It also show a way to format the xaxis labels as you wanted, derived from the following posts: Creating graph with date and time in axis labels with matplotlib and Plotting time in Python with Matplotlib.
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import dates
import datetime
plt.close('all')
#---- generate some data ----
t = [datetime.datetime(2015, 1, 1, 0) +
datetime.timedelta(hours=i) for i in np.arange(0,12.1,0.5)]
x = np.random.rand(len(t))
#---- create figure and axe ----
fig = plt.figure()
ax = fig.add_axes([0.1, 0.2, 0.85, 0.75])
#---- format xaxis ----
# position of the labels
xtk_loc = [datetime.datetime(2015, 1, 1, 0) +
datetime.timedelta(hours=i) for i in np.arange(0,12.1,0.5)]
ax.set_xticks(xtk_loc)
ax.tick_params(axis='both', direction='out', top='off', right='off')
# format of the labels
hfmt = dates.DateFormatter('%H:%M')
ax.xaxis.set_major_formatter(hfmt)
fig.autofmt_xdate(rotation=90, ha='center')
#---- set axes labels ----
ax.set_ylabel('Number of tasks', labelpad=10, fontsize=14)
ax.set_xlabel('Time', labelpad=20, fontsize=14)
#---- plot data ----
ax.plot(t, x, color="#004c99", label="Number of Tasks")
ax.fill_between(t, x, 0, facecolor='#00a1e4', alpha=0.5, lw=0.5)
#---- set axis limits ----
timemin = datetime.datetime(2015, 1, 1, 0)
timemax = datetime.datetime(2015, 1, 1, 12)
ax.axis(xmin=timemin, xmax=timemax)
plt.show()
which results in:
