Legend outside the plot in Matplotlib - Time & Space Complexity
We want to understand how the time to draw a legend outside the plot changes as the number of legend items grows.
How does adding more items affect the drawing time?
Analyze the time complexity of the following matplotlib code snippet.
import matplotlib.pyplot as plt
n = 10 # Define n before using it
fig, ax = plt.subplots()
for i in range(n):
ax.plot([0, 1], [i, i], label=f'Line {i}')
ax.legend(loc='center left', bbox_to_anchor=(1, 0.5))
plt.show()
This code plots n lines and places the legend outside the plot on the right side.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Loop adding n lines and legend entries.
- How many times: The loop runs n times, once per line and legend item.
As the number of lines n increases, the number of legend entries also increases, so the drawing work grows.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 legend items drawn |
| 100 | About 100 legend items drawn |
| 1000 | About 1000 legend items drawn |
Pattern observation: The work grows roughly in direct proportion to n.
Time Complexity: O(n)
This means the time to draw the legend grows linearly as you add more items.
[X] Wrong: "Adding the legend outside the plot does not affect drawing time much."
[OK] Correct: Even outside the plot, each legend item must be drawn, so more items mean more work.
Understanding how drawing elements scale helps you write efficient plotting code and explain performance in data visualization tasks.
"What if we used fewer legend items by grouping lines? How would the time complexity change?"
Practice
Solution
Step 1: Understand legend placement
Legends inside the plot can cover data points, making the plot hard to read.Step 2: Effect of placing legend outside
Placing the legend outside keeps the data visible and the plot clear.Final Answer:
To keep the data area clear and improve readability -> Option AQuick Check:
Legend outside = clear data area [OK]
- Thinking legend outside hides it
- Assuming it changes plot size automatically
- Believing it changes plot colors
bbox_to_anchor and loc?Solution
Step 1: Understand bbox_to_anchor coordinates
The tuple (1.05, 1) places the legend just outside the right edge at the top.Step 2: Match loc with bbox_to_anchor
Using loc='upper right' anchors the legend's upper right corner to the point (1.05, 1).Final Answer:
plt.legend(loc='upper right', bbox_to_anchor=(1.05, 1)) -> Option DQuick Check:
Right outside = bbox_to_anchor > 1 on x [OK]
- Using bbox_to_anchor inside plot area (less than 1)
- Mismatching loc and bbox_to_anchor
- Using negative bbox_to_anchor values incorrectly
import matplotlib.pyplot as plt plt.plot([1, 2, 3], label='Line') plt.legend(loc='center left', bbox_to_anchor=(1, 0.5)) plt.show()
Solution
Step 1: Analyze bbox_to_anchor coordinates
The point (1, 0.5) is at the right edge horizontally and center vertically.Step 2: Understand loc='center left'
The legend's center left side is anchored at (1, 0.5), placing it just outside the plot on the right center.Final Answer:
Legend appears outside the plot on the right center -> Option AQuick Check:
loc='center left' + bbox_to_anchor=(1,0.5) = right outside center [OK]
- Thinking legend is inside plot
- Confusing loc and bbox_to_anchor roles
- Expecting legend below plot
import matplotlib.pyplot as plt plt.plot([1, 2, 3], label='Data') plt.legend(loc='outer_right', bbox_to_anchor=(1.05, 1)) plt.show()
Solution
Step 1: Check loc parameter validity
Matplotlib does not support 'outer_right' as a valid loc string; valid locs include 'upper right', 'center left', etc.Step 2: Effect of invalid loc
Using 'outer_right' causes a ValueError and the legend will not display.Final Answer:
Invalid loc value 'outer_right' causes an error -> Option CQuick Check:
loc must be valid string like 'upper right' [OK]
- Using invalid loc strings
- Ignoring need for plt.tight_layout()
- Forgetting to add label to plot
Solution
Step 1: Choose correct legend position
loc='center left' with bbox_to_anchor=(1, 0.5) places the legend just outside the right center of the plot.Step 2: Use plt.tight_layout() to avoid overlap
Calling plt.tight_layout() adjusts the plot layout to prevent the legend from overlapping or being cut off.Final Answer:
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5)); plt.tight_layout() -> Option BQuick Check:
Right outside + tight_layout = no overlap [OK]
- Not using plt.tight_layout() causing overlap
- Placing legend inside plot by wrong bbox_to_anchor
- Using bbox_to_anchor with negative values incorrectly
Ready to prove it?
Pass the test and this pattern moves unknown
