How to Set Axis Limits in Matplotlib 3D Plots

When I first started creating 3D visualizations in Python, I often found that Matplotlib’s default scaling didn’t quite capture the story I wanted to tell.

The auto-scaling feature is great, but sometimes it crops out important context or makes small variations look like massive mountains.

In this tutorial, I will show you exactly how to control the X, Y, and Z axis ranges in a 3D environment using practical, real-world examples.

Need to Manually Set 3D Axis Ranges

By default, Matplotlib looks at your data and tries to find the “tightest” fit possible for your axes.

While this works for quick data exploration, it often fails when you are trying to compare two different datasets side-by-side.

If one plot ranges from 0 to 100 and the other from 0 to 1000, but they appear the same size on your screen, your audience will be very confused.

Setting a fixed range ensures that your 3D visualizations remain consistent and professionally scaled.

Method 1: Use the set_xlim, set_ylim, and set_zlim Methods

The most common way I adjust the 3D axis range is by using the specific setter methods provided by the Axes3D object.

In this example, let’s visualize the relationship between housing prices, average income, and population density in three major US regions.

I prefer this method because it is explicit and makes the code very easy for others to read.

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

# Sample Data: USA Real Estate Metrics (Hypothetical)
# X: Median Income (in $1000s)
# Y: Population Density (people per sq mile)
# Z: Median Home Price (in $1000s)

regions = ['Northeast', 'Midwest', 'West Coast']
income = [85, 60, 95]
density = [1200, 400, 900]
prices = [550, 300, 750]

fig = plt.figure(figsize=(10, 7))
ax = fig.add_subplot(111, projection='3d')

# Creating the scatter plot
ax.scatter(income, density, prices, c='blue', s=100)

# Setting the axis ranges manually
# I want to show a broad US economic context, not just the data points
ax.set_xlim(0, 150)    # Income range from $0 to $150k
ax.set_ylim(0, 2000)   # Density range up to 2000
ax.set_zlim(0, 1000)   # Home prices up to $1M

# Adding labels for clarity
ax.set_xlabel('Median Income ($1k)')
ax.set_ylabel('Pop. Density (sq/mi)')
ax.set_zlabel('Median Home Price ($1k)')

plt.title('USA Regional Housing Market Analysis')
plt.show()

You can see the output in the screenshot below.

How to Set Axis Limits in Matplotlib 3D Plots

When you run this, you’ll notice that the plot doesn’t “hug” the data points. Instead, it provides a wider perspective of the economic landscape.

Method 2: Use the set_array Style (The .set() Function)

If you are looking for a more concise way to write your code, I often use the generic .set() method.

This allows you to pass multiple axis limits in a single line of code, which keeps your scripts clean and organized.

I find this particularly useful when I am building dashboards and want to minimize the number of lines in my plotting functions.

import matplotlib.pyplot as plt

# Data: Tech Employee Stats in San Francisco vs Austin
# X: Years of Experience
# Y: Annual Bonus ($)
# Z: Total Compensation ($)
exp = [2, 5, 8, 12]
bonus = [5000, 15000, 25000, 40000]
total = [110000, 160000, 210000, 320000]

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

ax.plot(exp, bonus, total, marker='o', color='green')

# Using the .set() method to configure all ranges at once
ax.set(xlim=(0, 20), ylim=(0, 50000), zlim=(0, 400000))

ax.set_xlabel('Years of Experience')
ax.set_ylabel('Annual Bonus')
ax.set_zlabel('Total Compensation')

plt.title('Tech Salary Growth Projection (USA)')
plt.show()

You can see the output in the screenshot below.

Set Axis Limits in Matplotlib 3D Plots

I like this approach because it groups the structural configuration of the plot separately from the data visualization logic.

Method 3: Dynamically Setting Ranges Based on Data Padding

Sometimes, you don’t want to hardcode the numbers like “100” or “1000.” You might want the range to be slightly larger than your maximum data point.

In my experience, adding a 10% or 20% “buffer” or “padding” makes the 3D plot look much less cramped.

Here is how I calculate a dynamic range to ensure the markers never touch the walls of the 3D box.

import matplotlib.pyplot as plt
import numpy as np

# Data: CO2 Emissions of US Freight Trucks
# X: Distance Traveled (Miles)
# Y: Load Weight (Tons)
# Z: Fuel Consumed (Gallons)
distance = np.array([150, 300, 450, 600])
weight = np.array([10, 20, 15, 25])
fuel = np.array([30, 70, 60, 110])

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(distance, weight, fuel, color='red')

# Calculating dynamic limits with 15% padding
x_range = distance.max() * 1.15
y_range = weight.max() * 1.15
z_range = fuel.max() * 1.15

ax.set_xlim(0, x_range)
ax.set_ylim(0, y_range)
ax.set_zlim(0, z_range)

plt.title('US Freight Logistics Efficiency')
plt.show()

You can see the output in the screenshot below.

Set Axis Limits in Python Matplotlib 3D Plots

This method is essential if you are working with live data where the values change every day. It ensures your plot always looks perfectly framed.

Method 4: Invert the Axis Range

There are specific cases in data science where you might want the axis to go from high to low.

For example, if you are plotting “Rank” (where #1 is better than #50), you might want the Z-axis to be inverted.

I’ve used this many times when visualizing the performance of US universities or sports teams.

import matplotlib.pyplot as plt

# Data: Performance of a US Startup over 3 Quarters
# X: Quarter
# Y: Expenses
# Z: Market Rank (Lower is better)
q = [1, 2, 3]
exp = [100, 120, 110]
rank = [50, 25, 5]

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot(q, exp, rank, 'r--o')

# Inverting the Z-axis: from 60 down to 0
ax.set_zlim(60, 0) 

ax.set_xlabel('Fiscal Quarter')
ax.set_ylabel('Expenses ($1k)')
ax.set_zlabel('National Rank')

plt.title('Company Growth vs Market Competition')
plt.show()

By passing the larger number first in set_zlim(60, 0), Matplotlib automatically flips the orientation for you.

I hope this tutorial helped you get a better handle on controlling 3D axes in Matplotlib.

You may read:

51 Python Programs

51 PYTHON PROGRAMS PDF FREE

Download a FREE PDF (112 Pages) Containing 51 Useful Python Programs.

pyython developer roadmap

Aspiring to be a Python developer?

Download a FREE PDF on how to become a Python developer.

Let’s be friends

Be the first to know about sales and special discounts.