I like @jcoppens idea with axhspan. Here is an example using bar on top and step for the main plot. The top bar chart corresponds to the orange step plot on the bottom, and similarly for the green bar chart.
The orange or green color map in the bar charts corresponds to the number of people coming in (determined by a positive value in the associated step plot - by associated I mean green with green, orange with orange). The grayscale corresponds to people going out (determined by negative values in the associated step plot).

Code to generate the plot:
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.cm as cm
import matplotlib.colors as col
hr = ['{num:02d}'.format(num=i) for i in range(24)]
times = ['{0}:00'.format(h) for h in hr ]
tick_location = [t*4 for t in range(24)]
x1 = np.random.randint(-10, 20, 4*24)
x1[0:5] = 0
x1[20:30] = 0
x1[42:57] = 0
x1[69:74] = 0
x2 = np.random.randint(-3, 5, 4*24)
x2[0:25] = 0
x2[48:57] = 0
x2[89:] = 0
What you actually care about:
cmap_in_x1 = cm.ScalarMappable(col.Normalize(min(x1), max(x1)), 'Greens')
cmap_in_x2 = cm.ScalarMappable(col.Normalize(min(x2), max(x2)), 'Oranges')
cmap_out = cm.ScalarMappable(col.Normalize(min(x1), max(x1)), 'bone')
fig = plt.figure(figsize=(12,8))
big_ax = fig.add_axes([0.1, 0.1, 0.8, 0.6])
plt.grid()
small_ax_1 = fig.add_axes([0.1, 0.7, 0.8, 0.05], sharex=big_ax)
small_ax_2 = fig.add_axes([0.1, 0.75, 0.8, 0.05], sharex=big_ax)
big_ax.step(np.arange(len(x1)), x1, color='lightgreen', alpha=0.8, linewidth=2)
big_ax.step(np.arange(len(x2)), x2, color='orange', alpha=0.5, linewidth=2)
small_ax_1.bar(np.arange(len(x1>0)), x1>0, align='center', alpha=0.8, color=cmap_in_x1.to_rgba(x1))
small_ax_1.bar(np.arange(len(x1<0)), x1<0, align='center', alpha=1.0, color=cmap_out.to_rgba(x1))
small_ax_2.bar(np.arange(len(x2>0)), x2>0, align='center', alpha=0.8, color=cmap_in_x2.to_rgba(x2))
small_ax_2.bar(np.arange(len(x2<0)), x2<0, align='center', alpha=1.0, color=cmap_out.to_rgba(x2))
big_ax.set_xticks(tick_location)
big_ax.set_xticklabels(times, rotation=90)
big_ax.plot(np.zeros(len(x1)), color='black', linewidth=2)
plt.setp(small_ax_1.get_yticklabels(), visible=False)
plt.setp(small_ax_1.get_xticklabels(), visible=False)
plt.setp(small_ax_2.get_yticklabels(), visible=False)
plt.setp(small_ax_2.get_xticklabels(), visible=False)
plt.title('Bus Traffic', fontsize=24)
plt.show()