Matplotlib is a powerful Python library for creating visualizations, but sometimes the default legend placement can clutter your plots. This article demonstrates effective methods for placing legends outside the plot area for improved readability.
Table of Contents
- Using
bbox_to_anchor
for Legend Placement - Preventing Cropped Legends with
bbox_extra_artists
andbbox_inches
Using bbox_to_anchor
for Legend Placement
The bbox_to_anchor
argument in the legend()
function offers precise legend positioning. It takes an (x, y) tuple specifying the legend’s lower-left corner in figure coordinates. (0,0) is the bottom-left, and (1,1) is the top-right. The loc
argument further refines placement within that anchor point.
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
fig, ax = plt.subplots()
ax.plot(x, y1, label='sin(x)')
ax.plot(x, y2, label='cos(x)')
ax.legend(bbox_to_anchor=(1.1, 1), loc='upper left') # Adjust (1.1,1) as needed
ax.set_title('Sine and Cosine Waves')
ax.set_xlabel('x')
ax.set_ylabel('y')
plt.tight_layout()
plt.show()
Here, bbox_to_anchor=(1.1, 1)
places the legend slightly to the right of the plot (x=1.1) and at the top (y=1). loc='upper left'
aligns the legend within that anchor. Experiment with different loc
values (e.g., ‘upper right’, ‘lower left’, ‘center’) and adjust the (x,y) coordinates for optimal positioning.
Preventing Cropped Legends with bbox_extra_artists
and bbox_inches
Large legends or tight figures can lead to cropped legends even with bbox_to_anchor
. bbox_extra_artists
and bbox_inches
solve this. bbox_extra_artists
includes the legend in the bounding box calculation for saving, and bbox_inches='tight'
ensures tight margins, preventing cropping.
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 500) # More data for a larger legend
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.tan(x)
fig, ax = plt.subplots()
ax.plot(x, y1, label='sin(x)')
ax.plot(x, y2, label='cos(x)')
ax.plot(x, y3, label='tan(x)')
leg = ax.legend(bbox_to_anchor=(1.05, 1), loc='upper left')
fig.savefig('legend_outside.png', bbox_extra_artists=[leg], bbox_inches='tight')
plt.show()
The legend is stored in leg
, then passed to bbox_extra_artists
in savefig
. bbox_inches='tight'
ensures the entire figure, including the legend, is saved. Replace 'legend_outside.png'
with your desired filename.
These techniques enable flexible and effective legend placement in Matplotlib, enhancing the clarity and visual appeal of your plots. Experiment with different parameters to achieve the perfect layout.