Late answer for others who do this.
Actually there is a simple way, without phantom axes, next to your original desire. The Figure object has a patches attribute to which you can add a rectangle:
fig, ax = plt.subplots(nrows=1, ncols=1) ax.plot(np.cumsum(np.random.randn(100))) fig.patches.extend([plt.Rectangle((0.25,0.5),0.25,0.25, fill=True, color='g', alpha=0.5, zorder=1000, transform=fig.transFigure, figure=fig)])
Gives the following image (I am using a theme other than the default theme):

The transform argument allows you to use the coordinates at the shape level that I think you want.
Lucasb
source share