Bird
Raised Fist0
Matplotlibdata~5 mins

Secondary axes in Matplotlib - Time & Space Complexity

Choose your learning style10 modes available
Time Complexity: Secondary axes
O(n)
Understanding Time 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?

Scenario Under Consideration

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 Repeating Operations

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.
How Execution Grows With Input

As the number of points n increases, matplotlib must draw more points for both lines.

Input Size (n)Approx. Operations
10About 20 operations (10 points per line x 2 lines)
100About 200 operations
1000About 2000 operations

Pattern observation: The work grows roughly twice as fast as n because two lines are plotted, but still grows linearly with n.

Final Time Complexity

Time Complexity: O(n)

This means the time to draw the plot grows directly in proportion to the number of data points.

Common Mistake

[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.

Interview Connect

Understanding how plotting scales with data size helps you explain performance in data visualization tasks clearly and confidently.

Self-Check

"What if we added a loop to plot m different lines on the same axes? How would the time complexity change?"

Practice

(1/5)
1. What is the main purpose of using secondary_xaxis or secondary_yaxis in matplotlib?
easy
A. To add a new axis with a different scale on the same plot
B. To create a separate figure window
C. To change the color of the existing axis
D. To remove the original axis from the plot

Solution

  1. 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.
  2. Step 2: Identify the purpose of secondary_xaxis or secondary_yaxis

    These functions add a secondary axis to the existing plot to compare data with different units clearly.
  3. Final Answer:

    To add a new axis with a different scale on the same plot -> Option A
  4. Quick Check:

    Secondary axes = different scale on same plot [OK]
Hint: Secondary axes add a new scale on the same plot [OK]
Common Mistakes:
  • Thinking it creates a new figure
  • Confusing axis color change with adding axes
  • Assuming it removes original axes
2. Which of the following is the correct way to add a secondary y-axis in matplotlib?
easy
A. ax.add_secondary_yaxis('right', functions=(forward, inverse))
B. ax.add_secondary_axis('right', functions=(forward, inverse))
C. ax.secondary_yaxis('right', functions=(forward, inverse))
D. ax.secondary_axis('right', functions=(forward, inverse))

Solution

  1. Step 1: Recall the matplotlib method for secondary y-axis

    The correct method is secondary_yaxis called on the axes object.
  2. Step 2: Match the exact syntax

    The method is ax.secondary_yaxis('right', functions=(forward, inverse)) where 'right' is the position and functions are conversion functions.
  3. Final Answer:

    ax.secondary_yaxis('right', functions=(forward, inverse)) -> Option C
  4. Quick Check:

    Correct method name = secondary_yaxis [OK]
Hint: Use ax.secondary_yaxis with conversion functions [OK]
Common Mistakes:
  • Using incorrect method names like add_secondary_axis
  • Missing the functions parameter
  • Using secondary_axis instead of secondary_yaxis
3. What will be the output of this code snippet?
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())
medium
A. [0.0, 2.0]
B. [0, 20]
C. [0.0, 200.0]
D. [0, 10]

Solution

  1. 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).
  2. 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.
  3. Final Answer:

    [0.0, 2.0] -> Option A
  4. Quick Check:

    Secondary axis limits = original limits / 10 [OK]
Hint: Secondary axis limits = apply forward function to original limits [OK]
Common Mistakes:
  • Confusing forward and inverse functions
  • Expecting original limits instead of transformed
  • Assuming inverse function applies to limits
4. Identify the error in this code that tries to add a secondary x-axis:
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))
medium
A. The lambda functions should not be used
B. The order of functions in the tuple is reversed
C. The position 'top' is invalid for secondary_xaxis
D. The method name should be secondary_yaxis instead

Solution

  1. 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).
  2. 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.
  3. Final Answer:

    The order of functions in the tuple is reversed -> Option B
  4. Quick Check:

    Functions order = (forward, inverse) [OK]
Hint: First function forward, second inverse in tuple [OK]
Common Mistakes:
  • Swapping forward and inverse functions
  • Using invalid axis position
  • Confusing secondary_xaxis with secondary_yaxis
5. You have temperature data in Celsius and want to add a secondary y-axis in Fahrenheit on the right side. Which of these code snippets correctly creates the secondary axis with proper conversion?
hard
A. forward = lambda f: (f - 32) * 5/9 inverse = lambda c: (c * 9/5) + 32 ax.secondary_yaxis('right', functions=(inverse, forward))
B. forward = lambda c: (c * 5/9) + 32 inverse = lambda f: (f - 32) * 9/5 ax.secondary_yaxis('right', functions=(forward, inverse))
C. forward = lambda c: (c - 32) * 5/9 inverse = lambda f: (f * 9/5) + 32 ax.secondary_yaxis('left', functions=(forward, inverse))
D. forward = lambda c: (c * 9/5) + 32 inverse = lambda f: (f - 32) * 5/9 ax.secondary_yaxis('right', functions=(forward, inverse))

Solution

  1. Step 1: Recall Celsius to Fahrenheit conversion formulas

    Celsius to Fahrenheit: F = (C * 9/5) + 32; Fahrenheit to Celsius: C = (F - 32) * 5/9.
  2. 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.
  3. Final Answer:

    forward = lambda c: (c * 9/5) + 32 inverse = lambda f: (f - 32) * 5/9 ax.secondary_yaxis('right', functions=(forward, inverse)) -> Option D
  4. Quick 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]
Hint: Forward: C to F; Inverse: F to C; position 'right' for y-axis [OK]
Common Mistakes:
  • Swapping forward and inverse functions
  • Using wrong conversion formulas
  • Placing secondary axis on 'left' instead of 'right'
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard