Secondary axes in Matplotlib - Time & Space Complexity
We want to understand how the time to create a plot with secondary axes changes as the data size grows.
How does adding a secondary axis affect the work matplotlib does?
Analyze the time complexity of the following code snippet.
import matplotlib.pyplot as plt
import numpy as np
n = 100 # example size
x = np.linspace(0, 10, n)
y1 = np.sin(x)
y2 = np.log(x + 1)
fig, ax1 = plt.subplots()
ax1.plot(x, y1, 'b-')
ax2 = ax1.twinx()
ax2.plot(x, y2, 'r--')
This code creates a plot with two y-axes sharing the same x-axis, plotting two different data series.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Plotting each data point for both y1 and y2 arrays.
- How many times: Each plotting call processes all n points once.
As the number of points n increases, matplotlib must draw more points for both lines.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 20 operations (10 points per line x 2 lines) |
| 100 | About 200 operations |
| 1000 | About 2000 operations |
Pattern observation: The work grows roughly twice as fast as n because two lines are plotted, but still grows linearly with n.
Time Complexity: O(n)
This means the time to draw the plot grows directly in proportion to the number of data points.
[X] Wrong: "Adding a secondary axis doubles the time complexity to O(n²)."
[OK] Correct: The secondary axis adds another line to plot, but each line is drawn once over n points, so the time grows linearly, not quadratically.
Understanding how plotting scales with data size helps you explain performance in data visualization tasks clearly and confidently.
"What if we added a loop to plot m different lines on the same axes? How would the time complexity change?"
Practice
secondary_xaxis or secondary_yaxis in matplotlib?Solution
Step 1: Understand the concept of secondary axes
Secondary axes allow adding a new axis that shares the same plot but has a different scale or units.Step 2: Identify the purpose of
These functions add a secondary axis to the existing plot to compare data with different units clearly.secondary_xaxisorsecondary_yaxisFinal Answer:
To add a new axis with a different scale on the same plot -> Option AQuick Check:
Secondary axes = different scale on same plot [OK]
- Thinking it creates a new figure
- Confusing axis color change with adding axes
- Assuming it removes original axes
Solution
Step 1: Recall the matplotlib method for secondary y-axis
The correct method issecondary_yaxiscalled on the axes object.Step 2: Match the exact syntax
The method isax.secondary_yaxis('right', functions=(forward, inverse))where 'right' is the position and functions are conversion functions.Final Answer:
ax.secondary_yaxis('right', functions=(forward, inverse)) -> Option CQuick Check:
Correct method name = secondary_yaxis [OK]
- Using incorrect method names like add_secondary_axis
- Missing the functions parameter
- Using secondary_axis instead of secondary_yaxis
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.plot([0, 1, 2], [0, 10, 20])
forward = lambda x: x / 10
inverse = lambda x: x * 10
secax = ax.secondary_yaxis('right', functions=(forward, inverse))
print(secax.get_ylim())Solution
Step 1: Understand the original y-axis limits
The original y-axis data ranges from 0 to 20, so default limits are approximately (0, 20).Step 2: Apply the forward function to original limits for secondary axis
The forward function divides by 10, so 0 becomes 0.0 and 20 becomes 2.0 on the secondary axis.Final Answer:
[0.0, 2.0] -> Option AQuick Check:
Secondary axis limits = original limits / 10 [OK]
- Confusing forward and inverse functions
- Expecting original limits instead of transformed
- Assuming inverse function applies to limits
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.plot([0, 1, 2], [0, 1, 4])
forward = lambda x: x * 2
inverse = lambda x: x / 2
secax = ax.secondary_xaxis('top', functions=(inverse, forward))Solution
Step 1: Check the order of conversion functions
The first function should convert from primary to secondary axis (forward), the second from secondary to primary (inverse).Step 2: Identify the mistake in the code
The code uses (inverse, forward) instead of (forward, inverse), so the order is reversed causing incorrect scaling.Final Answer:
The order of functions in the tuple is reversed -> Option BQuick Check:
Functions order = (forward, inverse) [OK]
- Swapping forward and inverse functions
- Using invalid axis position
- Confusing secondary_xaxis with secondary_yaxis
Solution
Step 1: Recall Celsius to Fahrenheit conversion formulas
Celsius to Fahrenheit: F = (C * 9/5) + 32; Fahrenheit to Celsius: C = (F - 32) * 5/9.Step 2: Match the forward and inverse functions correctly
Forward converts primary (C) to secondary (F), inverse converts secondary (F) back to primary (C). Position 'right' is correct for secondary y-axis.Final Answer:
forward = lambda c: (c * 9/5) + 32 inverse = lambda f: (f - 32) * 5/9 ax.secondary_yaxis('right', functions=(forward, inverse)) -> Option DQuick Check:
Correct conversion and axis position = forward = lambda c: (c * 9/5) + 32 inverse = lambda f: (f - 32) * 5/9 ax.secondary_yaxis('right', functions=(forward, inverse)) [OK]
- Swapping forward and inverse functions
- Using wrong conversion formulas
- Placing secondary axis on 'left' instead of 'right'
Ready to prove it?
Pass the test and this pattern moves unknown
