 <p>A solution could be to explore the boundingbox from the text objects and generate a box yourself. Its not very convenient. Perhaps my example can be improved, transformations always confuse me a bit.</p> <pre><code>import matplotlib.patches as patches import matplotlib.pyplot as plt fig, axs = plt.subplots(1,1) t1 = axs.text(0.4,0.6, 'Hello world line 1', ha='center', color='red', weight='bold', transform=axs.transAxes) t2 = axs.text(0.5,0.5, 'Hello world line 2', ha='center', color='green', weight='bold', transform=axs.transAxes) t3 = axs.text(0.6,0.4, 'Hello world line 3', ha='center', color='blue', weight='bold', transform=axs.transAxes) fig.canvas.draw() textobjs = [t1,t2,t3] xmin = min([t.get_window_extent().xmin for t in textobjs]) xmax = max([t.get_window_extent().xmax for t in textobjs]) ymin = min([t.get_window_extent().ymin for t in textobjs]) ymax = max([t.get_window_extent().ymax for t in textobjs]) xmin, ymin = fig.transFigure.inverted().transform((xmin, ymin)) xmax, ymax = fig.transFigure.inverted().transform((xmax, ymax)) rect = patches.Rectangle((xmin,ymin),xmax-xmin,ymax-ymin, facecolor='grey', alpha=0.2, transform=fig.transFigure) axs.add_patch(rect) </code></pre> <p>You might want to add a small buffer etc, but the idea would stay the same.</p> <p><img src="https://i.stack.imgur.com/QHOWe.png" alt="enter image description here"></p>