Custom Legend with Matplotlib

Legends are crucial for effectively communicating the meaning behind your visualizations. In this tutorial, we will cover different ways to customize legends in Matplotlib to enhance your data visualizations.

## Getting Started

First, let's import the necessary libraries and create a simple plot example so we can work with it.

import matplotlib.pyplot as plt
import numpy as np

# Sample Data
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)

# Create Plot
fig, ax = plt.subplots()
ax.plot(x, y1, label='Sine Wave')
ax.plot(x, y2, label='Cosine Wave')
ax.legend()
plt.show()
Now we have a basic plot with default legends. Let's dive into customizing this legend.

## Customizing Legend Location

You can easily change the location of the legend using the `loc` parameter. The `loc` parameter takes a string or a tuple to decide the location.

import matplotlib.pyplot as plt
import numpy as np

# Sample Data
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)

fig, ax = plt.subplots()
ax.plot(x, y1, label='Sine Wave')
ax.plot(x, y2, label='Cosine Wave')
ax.legend(loc='upper right')  # Change legend position
plt.show()
## Adding a Title to the Legend

You can add a title to your legend to provide extra context.

import matplotlib.pyplot as plt
import numpy as np

# Sample Data
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)

fig, ax = plt.subplots()
ax.plot(x, y1, label='Sine Wave')
ax.plot(x, y2, label='Cosine Wave')

legend = ax.legend(loc='upper right')
legend.set_title('Waves')  # Set legend title

plt.show()
## Customizing Legend Font Size

You can customize the font size and other properties of the legend text.

import matplotlib.pyplot as plt
import numpy as np

# Sample Data
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)

fig, ax = plt.subplots()
ax.plot(x, y1, label='Sine Wave')
ax.plot(x, y2, label='Cosine Wave')

ax.legend(loc='upper right', fontsize='large', title='Waves', title_fontsize='medium')
plt.show()
## Customizing Legend Handles and Labels

If you have multiple plot elements, you can specify which ones should appear in the legend.

import matplotlib.pyplot as plt
import numpy as np

# Sample Data
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)

fig, ax = plt.subplots()
line1, = ax.plot(x, y1, label='Sine Wave')
line2, = ax.plot(x, y2, label='Cosine Wave')

# Custom legend handles and labels
ax.legend(handles=[line1], labels=['Only Sine'])
plt.show()
## Customizing Legend Colors

You can also customize the colors in the legend.

import matplotlib.pyplot as plt
import numpy as np

# Sample Data
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)

fig, ax = plt.subplots()
ax.plot(x, y1, label='Sine Wave', color='blue')
ax.plot(x, y2, label='Cosine Wave', color='green')

# Customizing legend colors
legend = ax.legend()
for text, line in zip(legend.get_texts(), legend.get_lines()):
    text.set_color(line.get_color())

plt.show()
## Using Legend Outside the Plot

Sometimes you might need to place the legend outside the actual plot area for clarity.

import matplotlib.pyplot as plt
import numpy as np

# Sample Data
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)

fig, ax = plt.subplots()
ax.plot(x, y1, label='Sine Wave')
ax.plot(x, y2, label='Cosine Wave')

# Place legend outside of the plot
ax.legend(loc='center left', bbox_to_anchor=(1, 0.5))

plt.show()
## Conclusion

In this tutorial, we explored different ways to customize legends in Matplotlib to enhance the readability and interpretation of data visualizations.