Customize Axis Labels in Python 3D plots

This tutorial will guide you through various methods to customize your Python 3D plot labels using Matplotlib.

You’ll learn how to set basic labels, adjust their positioning, format text, handle multi-line labels, and more.

 

 

Set Axis Labels

To set basic axis labels for your 3D plot, you can use the set_xlabel(), set_ylabel(), and set_zlabel() methods.

Here’s how to create a simple 3D surface plot with custom axis labels:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
surf = ax.plot_surface(X, Y, Z, cmap='viridis')
ax.set_xlabel('X-axis')
ax.set_ylabel('Y-axis')
ax.set_zlabel('Z-axis')
plt.show()

Output:

Set Axis Labels

The set_xlabel(), set_ylabel(), and set_zlabel() methods are used to set the labels for the X, Y, and Z axes, respectively.

 

Label Positioning (Label Padding)

Here’s how to modify label distance:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
x = np.linspace(-5, 5, 50)
y = np.linspace(-5, 5, 50)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) * np.cos(Y)
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111, projection='3d')
surf = ax.plot_surface(X, Y, Z, cmap='coolwarm')

# Set and adjust axis labels
ax.set_xlabel('X-axis', labelpad=20)
ax.set_ylabel('Y-axis', labelpad=20)
ax.set_zlabel('Z-axis', labelpad=20)
plt.show()

Output:

Label Padding

In this example, we use the labelpad parameter to adjust the distance between the axis and its label.

 

Format Label Text Using LaTeX

You can use LaTeX expressions for mathematical notation.

Matplotlib supports LaTeX rendering so you can format labels with complex mathematical expressions:

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

# Sample data
x = np.linspace(0, 10, 50)
y = np.linspace(0, 10, 50)
X, Y = np.meshgrid(x, y)
Z = X**2 + Y**2
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111, projection='3d')
surf = ax.plot_surface(X, Y, Z, cmap='plasma')

# Set formatted axis labels using LaTeX
ax.set_xlabel(r'$\mathbf{x}$ (meters)')
ax.set_ylabel(r'$\mathbf{y}$ (meters)')
ax.set_zlabel(r'$z = x^2 + y^2$')
plt.show()

Output:

Format Label Text Using LaTeX

The r prefix before the string indicates a raw string, which is useful for LaTeX expressions.

The $ symbols denote the start and end of LaTeX math mode. This allows you to include mathematical symbols, Greek letters, and equations in your labels.

 

Handle Units and Scientific notation

Here’s how to add units to labels and use scientific notation:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.ticker import ScalarFormatter, FuncFormatter
x = np.linspace(0, 1e-6, 100)
y = np.linspace(0, 1e-6, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(X*1e6) * np.cos(Y*1e6)
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111, projection='3d')
surf = ax.plot_surface(X, Y, Z, cmap='viridis')

# Set labels with units
ax.set_xlabel('X (µm)')
ax.set_ylabel('Y (µm)')
ax.set_zlabel('Z (arbitrary units)')

# Use ScalarFormatter for scientific notation
ax.xaxis.set_major_formatter(ScalarFormatter(useMathText=True))
ax.yaxis.set_major_formatter(ScalarFormatter(useMathText=True))

# Custom formatter for unit conversion
def um_formatter(x, pos):
    return f'{x*1e6:.1f}'
ax.xaxis.set_major_formatter(FuncFormatter(um_formatter))
ax.yaxis.set_major_formatter(FuncFormatter(um_formatter))
plt.show()

Output:

Scientific notation

Here we use ScalarFormatter for scientific notation, and create a custom formatter for unit conversion.

The X and Y axes are displayed in micrometers (µm) using a custom formatter.

 

Multi-line Labels

You can create multi-line labels to include additional information or break long labels into multiple lines.

Here’s how to implement multi-line labels and adjust line spacing:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
theta = np.linspace(0, 2*np.pi, 100)
z = np.linspace(0, 2, 100)
r = z**2 + 1
x = r * np.sin(theta)
y = r * np.cos(theta)
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111, projection='3d')
ax.plot(x, y, z)

# Set multi-line labels
ax.set_xlabel('X-axis\n(Horizontal)', linespacing=1.5)
ax.set_ylabel('Y-axis\n(Depth)', linespacing=1.5)
ax.set_zlabel('Z-axis\n(Vertical)\n(Height)', linespacing=1.2)
plt.show()

Output:

Multi-line Labels

In this example, we use \n to create line breaks in the label text.

The linespacing parameter is used to adjust the spacing between lines in multi-line labels.

A value greater than 1 increases the space between lines, while a value less than 1 decreases it.

 

Using External Data for Labels (Dynamic Labels)

You can use external data sources to generate dynamic labels for your 3D plots.

Given this CSV file:

X-axis Label,Y-axis Label,Z-axis Label

Here’s an example of how to import labels from a CSV file and use them in your plot:

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

# Import labels from CSV file
with open('axis_labels.csv', 'r') as file:
    reader = csv.reader(file)
    labels = next(reader)
x = np.random.rand(100)
y = np.random.rand(100)
z = np.random.rand(100)
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x, y, z)

# Set labels using imported data
ax.set_xlabel(labels[0])
ax.set_ylabel(labels[1])
ax.set_zlabel(labels[2])
plt.show()

Output:

External Data for Labels

This code reads the labels from the file and applies them to the plot axes.

 

Label Visibility and Clipping

Here’s how to toggle label visibility and adjust the plot to prevent label clipping:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
x = np.linspace(-5, 5, 50)
y = np.linspace(-5, 5, 50)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111, projection='3d')
surf = ax.plot_surface(X, Y, Z, cmap='viridis')
ax.set_xlabel('X-axis')
ax.set_ylabel('Y-axis')
ax.set_zlabel('Z-axis')

# Toggle label visibility
ax.xaxis.label.set_visible(False)

# Adjust plot to prevent label clipping
plt.tight_layout()
plt.subplots_adjust(left=0.1, right=0.9, bottom=0.1, top=0.9)
plt.show()

Output:

Label Visibility

In this example, we set labels for all axes but then hide the X-axis label using set_visible(False).

To prevent label clipping in tight layouts, we use plt.tight_layout() and plt.subplots_adjust() to fine-tune the plot margins.

 

Label Shadow & Outline

You can enhance your axis labels with decorative elements like boxes, shadows, or outlines.

Here’s how to add these decorators to your labels:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.patheffects import withStroke
x = np.linspace(-5, 5, 50)
y = np.linspace(-5, 5, 50)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) * np.cos(Y)
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111, projection='3d')
surf = ax.plot_surface(X, Y, Z, cmap='coolwarm')

# Set labels with decorators
ax.set_xlabel('X-axis', bbox=dict(facecolor='white', edgecolor='black', pad=5))
ax.set_ylabel('Y-axis', path_effects=[withStroke(linewidth=3, foreground='green')])
ax.set_zlabel('Z-axis', bbox=dict(facecolor='yellow', alpha=0.5),
              path_effects=[withStroke(linewidth=3, foreground='black')])
plt.show()

Output:

Label Shadow & Outline

In this example, we apply different decorators to each axis label:
– The X-axis label has a white box with a black edge.
– The Y-axis label has a green outline.
– The Z-axis label has a semi-transparent yellow box and a black outline.

Leave a Reply

Your email address will not be published. Required fields are marked *