Sometimes you want to explain your plot with labels that are different from the default ones. Custom legend entries let you create clear, easy-to-understand legends for your charts.
Custom legend entries in Matplotlib
import matplotlib.pyplot as plt from matplotlib.lines import Line2D # Create custom legend entries custom_legend = [ Line2D([0], [0], color='blue', lw=2, label='Blue line'), Line2D([0], [0], marker='o', color='w', markerfacecolor='red', markersize=10, label='Red dots') ] # Add legend to plot plt.legend(handles=custom_legend)
You create custom legend entries by making objects like Line2D or Patch with the style you want.
Then you pass these objects as a list to the handles parameter of plt.legend().
import matplotlib.pyplot as plt from matplotlib.lines import Line2D # Empty plot plt.plot([]) # Custom legend with one entry custom_legend = [Line2D([0], [0], color='green', lw=3, label='Green line')] plt.legend(handles=custom_legend) plt.show()
import matplotlib.pyplot as plt from matplotlib.lines import Line2D # Plot one line plt.plot([1, 2, 3], [4, 5, 6], color='purple') # Custom legend with two entries custom_legend = [ Line2D([0], [0], color='purple', lw=2, label='Purple line'), Line2D([0], [0], marker='s', color='w', markerfacecolor='orange', markersize=8, label='Orange square') ] plt.legend(handles=custom_legend) plt.show()
import matplotlib.pyplot as plt from matplotlib.patches import Patch # Plot bars plt.bar([1, 2], [3, 4], color='cyan') # Custom legend with patch custom_legend = [Patch(facecolor='cyan', label='Cyan bars')] plt.legend(handles=custom_legend) plt.show()
This program first shows a normal legend for two lines. Then it shows how to add a custom legend with an extra marker entry that is not plotted.
import matplotlib.pyplot as plt from matplotlib.lines import Line2D # Plot two lines x_values = [0, 1, 2, 3] line1 = plt.plot(x_values, [1, 2, 3, 4], color='blue') line2 = plt.plot(x_values, [4, 3, 2, 1], color='red') print('Before adding custom legend:') plt.legend(['Blue line', 'Red line']) plt.show() # Now create custom legend entries custom_legend = [ Line2D([0], [0], color='blue', lw=2, label='Blue line'), Line2D([0], [0], color='red', lw=2, label='Red line'), Line2D([0], [0], marker='o', color='w', markerfacecolor='green', markersize=10, label='Special marker') ] print('After adding custom legend with extra marker:') plt.plot(x_values, [1, 2, 3, 4], color='blue') plt.plot(x_values, [4, 3, 2, 1], color='red') plt.legend(handles=custom_legend) plt.show()
Time complexity is very low since legend creation is simple and fast.
Space complexity depends on how many custom entries you create, usually small.
Common mistake: forgetting to pass the custom objects to handles and expecting automatic legend.
Use custom legend entries when you want full control over legend appearance beyond automatic labels.
Custom legend entries let you create clear, tailored legends for your plots.
You create legend items using objects like Line2D or Patch with desired styles.
Pass these objects as a list to plt.legend(handles=...) to show your custom legend.
Practice
matplotlib?Solution
Step 1: Understand legend purpose
Legends explain what different plot elements represent.Step 2: Identify custom legend role
Custom legend entries add labels for elements not labeled automatically.Final Answer:
To add labels for plot elements that are not automatically labeled -> Option CQuick Check:
Custom legend entries = add labels [OK]
- Confusing legend with plot size or color
- Thinking legend changes plot background
- Assuming legend saves the plot
matplotlib.lines.Line2D?Solution
Step 1: Check Line2D constructor
Line2D requires x and y data points as first two arguments.Step 2: Verify correct syntax
Line2D([0], [0], color='red', label='Red Line') uses [0], [0] for points, color='red', and label='Red Line' correctly.Final Answer:
Line2D([0], [0], color='red', label='Red Line') -> Option AQuick Check:
Line2D needs x,y points + color + label [OK]
- Omitting x and y data points
- Passing color as positional argument
- Missing label parameter
import matplotlib.pyplot as plt from matplotlib.lines import Line2D plt.plot([1, 2, 3], [4, 5, 6], 'b-') custom_line = Line2D([0], [0], color='red', lw=2) plt.legend([custom_line], ['Custom Red Line']) plt.show()
Solution
Step 1: Analyze plot and legend calls
Plot draws a blue line but legend uses only custom_line handle with label 'Custom Red Line'.Step 2: Understand legend content
Legend shows only what is passed: one red line with label 'Custom Red Line'.Final Answer:
A legend with one label: 'Custom Red Line' shown in red -> Option DQuick Check:
Legend shows passed handles and labels only [OK]
- Assuming plot lines auto-appear in legend
- Expecting multiple legend entries without passing handles
- Thinking legend is empty
import matplotlib.pyplot as plt from matplotlib.patches import Patch patch = Patch(color='green', label='Green Square') plt.legend(handles=patch, labels=['Green Square']) plt.show()
Solution
Step 1: Check handles argument type
plt.legend expects handles as a list or iterable, not a single object.Step 2: Identify fix
Wrap patch in a list: handles=[patch] to fix the error.Final Answer:
The 'handles' argument should be a list, not a single Patch object -> Option BQuick Check:
Handles must be list or iterable [OK]
- Passing single object instead of list to handles
- Ignoring label parameter in Patch
- Calling plt.show() before plt.legend()
Solution
Step 1: Identify correct legend handles
Blue dashed line and red circle marker require Line2D objects with correct styles.Step 2: Verify code correctness
from matplotlib.lines import Line2D legend_elements = [Line2D([0], [0], color='blue', lw=2, linestyle='--', label='Trend'), Line2D([0], [0], marker='o', color='red', linestyle='', label='Data Point')] plt.legend(handles=legend_elements) creates Line2D with color='blue', linestyle='--' for 'Trend' and marker='o', color='red' for 'Data Point', then passes handles to plt.legend.Final Answer:
from matplotlib.lines import Line2D legend_elements = [Line2D([0], [0], color='blue', lw=2, linestyle='--', label='Trend'), Line2D([0], [0], marker='o', color='red', linestyle='', label='Data Point')] plt.legend(handles=legend_elements) -> Option AQuick Check:
Use Line2D with style and marker for custom legend [OK]
- Using Patch for line and marker legend
- Passing only label strings without handles
- Ignoring linestyle or marker parameters
Ready to prove it?
Pass the test and this pattern moves unknown
