3D contour plots are a powerful visualization tool to represent three-dimensional data on a two-dimensional surface. They show contours or “iso-surfaces” that represent different levels of a variable (often a Z value) over a grid of X and Y values.
This is particularly useful in fields like geography, meteorology, and engineering to visualize landscapes, potential fields, or temperature distributions.
In this tutorial, we’ll explore how to create and customize 3D contour plots in Matplotlib using examples covering the basics, filled contours, contour projections, adding color bars, customizing contour levels, and using colormaps.
To create 3D contour plots, we need to import Axes3D from mpl_toolkits.mplot3d and use contour3D or contourf functions to plot the contours.
import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D import numpy as np
1. Basic 3D Contour Plot
A basic 3D contour plot is created using contour3D, which requires X, Y, and Z coordinates.
# Generate sample data 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)) # Create a basic 3D contour plot fig = plt.figure(figsize=(10, 8)) ax = fig.add_subplot(111, projection='3d') contour = ax.contour3D(X, Y, Z, levels=20, cmap='viridis') ax.set_xlabel("X-axis") ax.set_ylabel("Y-axis") ax.set_zlabel("Z-axis") plt.title("Basic 3D Contour Plot") plt.show()
In this example:
- ax.contour3D(X, Y, Z, levels=20, cmap='viridis') creates a 3D contour plot with 20 contour levels and the viridis colormap.
- The Z values are computed using np.sin(np.sqrt(X**2 + Y**2)), creating concentric contour levels.
2. 3D Contour Plot with Color Bar
A color bar helps interpret the color scale of contour levels, indicating the Z values for each color in the plot.
# 3D contour plot with color bar fig = plt.figure(figsize=(10, 8)) ax = fig.add_subplot(111, projection='3d') contour = ax.contour3D(X, Y, Z, levels=20, cmap='plasma') fig.colorbar(contour, ax=ax, shrink=0.5, aspect=5, label="Z value") ax.set_xlabel("X-axis") ax.set_ylabel("Y-axis") ax.set_zlabel("Z-axis") plt.title("3D Contour Plot with Color Bar") plt.show()
In this example:
- fig.colorbar(contour, ax=ax, label=”Z value”) adds a color bar on the right side, labeling it with “Z value.”
3. 3D Filled Contour Plot (Isosurface)
Filled contour plots, also called “isosurfaces” in 3D plotting, display continuous color across the contour surface, enhancing readability.
# Generate data for filled contour plot fig = plt.figure(figsize=(10, 8)) ax = fig.add_subplot(111, projection='3d') ax.contourf(X, Y, Z, levels=20, cmap='coolwarm', alpha=0.7) ax.set_xlabel("X-axis") ax.set_ylabel("Y-axis") ax.set_zlabel("Z-axis") plt.title("3D Filled Contour Plot") plt.show()
In this example:
- ax.contourf(X, Y, Z, levels=20, cmap='coolwarm', alpha=0.7) creates a filled contour plot in 3D with a semi-transparent color fill (alpha=0.7).
4. Customizing Contour Levels
You can specify custom contour levels to control where the contours appear on the plot.
# Custom contour levels custom_levels = [-0.8, -0.4, 0, 0.4, 0.8] fig = plt.figure(figsize=(10, 8)) ax = fig.add_subplot(111, projection='3d') ax.contour3D(X, Y, Z, levels=custom_levels, cmap='plasma') ax.set_xlabel("X-axis") ax.set_ylabel("Y-axis") ax.set_zlabel("Z-axis") plt.title("3D Contour Plot with Custom Levels") plt.show()
In this example:
- levels=custom_levels defines specific contour levels, creating contours only at the specified Z values.
5. 3D Contour Plot with Projections on XY Plane
Contour projections can be added to the XY plane below the 3D plot to show how the contours align with the Z-axis levels on a 2D plane.
# 3D contour plot with projections on the XY plane fig = plt.figure(figsize=(10, 8)) ax = fig.add_subplot(111, projection='3d') ax.contour3D(X, Y, Z, levels=20, cmap='viridis') ax.contour(X, Y, Z, levels=10, cmap='viridis', offset=-1) # Projected contour on XY plane ax.set_xlabel("X-axis") ax.set_ylabel("Y-axis") ax.set_zlabel("Z-axis") ax.set_zlim(-1, 1) plt.title("3D Contour Plot with Projections on XY Plane") plt.show()
In this example:
- ax.contour(X, Y, Z, levels=10, offset=-1) adds contours on the XY plane, with offset=-1 setting the Z position of the projected contours.
6. 3D Contour Plot with Different Line Styles and Widths
Customizing line styles and widths can make contours more readable and visually appealing.
# 3D contour plot with custom line styles fig = plt.figure(figsize=(10, 8)) ax = fig.add_subplot(111, projection='3d') ax.contour3D(X, Y, Z, levels=10, cmap='cool', linestyles='dashed', linewidths=1.5) ax.set_xlabel("X-axis") ax.set_ylabel("Y-axis") ax.set_zlabel("Z-axis") plt.title("3D Contour Plot with Custom Line Styles") plt.show()
In this example:
- linestyles='dashed' and linewidths=1.5 customize the contour lines to be dashed and thicker.
7. Logarithmic 3D Contour Plot
For datasets spanning several orders of magnitude, using logarithmic scales for contour levels can help improve readability.
# Logarithmic 3D contour plot Z_log = np.exp(Z) # Transform Z values to a larger range for logarithmic plotting fig = plt.figure(figsize=(10, 8)) ax = fig.add_subplot(111, projection='3d') ax.contour3D(X, Y, Z_log, levels=np.logspace(0, 3, 10), cmap='inferno') ax.set_xlabel("X-axis") ax.set_ylabel("Y-axis") ax.set_zlabel("Z-axis") plt.title("Logarithmic 3D Contour Plot") plt.show()
In this example:
- np.logspace(0, 3, 10) creates contour levels on a logarithmic scale, making it suitable for large data ranges.
8. Contour Plot Overlayed on a 3D Surface Plot
Overlaying contours on a 3D surface plot combines the continuous surface with contour lines, which can make 3D data easier to interpret.
# Surface plot with overlayed contours fig = plt.figure(figsize=(10, 8)) ax = fig.add_subplot(111, projection='3d') ax.plot_surface(X, Y, Z, cmap='coolwarm', alpha=0.6) ax.contour3D(X, Y, Z, levels=15, cmap='cool', linewidths=1.2) ax.set_xlabel("X-axis") ax.set_ylabel("Y-axis") ax.set_zlabel("Z-axis") plt.title("3D Surface Plot with Overlayed Contours") plt.show()
In this example:
- ax.plot_surface() creates the surface plot, while ax.contour3D() adds contours on top.
- alpha=0.6 makes the surface partially transparent, making the contours more visible.
9. Customizing Viewing Angle
Adjusting the viewing angle of the 3D plot can enhance the perspective and make the contour plot easier to interpret.
# Contour plot with custom viewing angle fig = plt.figure(figsize=(10, 8)) ax = fig.add_subplot(111, projection='3d') ax.contour3D(X, Y, Z, levels=20, cmap='magma') ax.view_init(elev=30, azim=45) ax.set_xlabel("X-axis") ax.set_ylabel("Y-axis") ax.set_zlabel("Z-axis") plt.title("3D Contour Plot with Custom Viewing Angle") plt.show()
In this example:
- ax.view_init(elev=30, azim=45) adjusts the elevation and azimuth angles to improve the view of the plot.
10
. Combining Multiple 3D Contour Sets
You can overlay multiple contour sets on the same plot to compare different levels or highlight specific ranges of data.
# Overlay multiple contour sets fig = plt.figure(figsize=(10, 8)) ax = fig.add_subplot(111, projection='3d') # First contour set ax.contour3D(X, Y, Z, levels=10, cmap='Blues', linewidths=1) # Second contour set with different levels ax.contour3D(X, Y, Z, levels=[-0.5, 0, 0.5], colors='red', linestyles='solid', linewidths=1.5) ax.set_xlabel("X-axis") ax.set_ylabel("Y-axis") ax.set_zlabel("Z-axis") plt.title("3D Contour Plot with Multiple Contour Sets") plt.show()
In this example:
- ax.contour3D(X, Y, Z, levels=[-0.5, 0, 0.5], colors='red') adds a second contour set, highlighting specific levels in red.
11. Projected Contours on Multiple Planes
You can project contours onto multiple planes, such as the XY, YZ, and XZ planes, to show how the data varies along different axes.
# Projected contours on multiple planes fig = plt.figure(figsize=(10, 8)) ax = fig.add_subplot(111, projection='3d') # Surface plot ax.plot_surface(X, Y, Z, cmap='viridis', edgecolor='none', alpha=0.7) # Projected contours on XY, YZ, and XZ planes ax.contour(X, Y, Z, levels=10, cmap='cool', offset=-1, zdir='z') ax.contour(X, Y, Z, levels=10, cmap='plasma', offset=5, zdir='x') ax.contour(X, Y, Z, levels=10, cmap='magma', offset=-5, zdir='y') ax.set_xlim(-5, 5) ax.set_ylim(-5, 5) ax.set_zlim(-1, 1) ax.set_xlabel("X-axis") ax.set_ylabel("Y-axis") ax.set_zlabel("Z-axis") plt.title("3D Contour Plot with Projections on Multiple Planes") plt.show()
In this example:
- zdir='z', zdir='x', and zdir='y' specify which plane to project the contours onto.
- offset defines the position of each projection.
Summary
In this tutorial, we explored a variety of ways to create and customize 3D contour plots in Matplotlib:
- Basic 3D Contour Plot to show 3D data contours.
- Adding Color Bars for better data interpretation.
- 3D Filled Contour Plot for continuous color representation.
- Customizing Contour Levels for specific data ranges.
- Contour Projections on the XY Plane for data interpretation on 2D.
- Custom Line Styles and Widths for visual enhancement.
- Logarithmic Contour Plot for data with large ranges.
- Overlaying Contours on a Surface Plot for additional depth.
- Custom Viewing Angle for better perspective.
- Multiple Contour Sets to compare different levels.
- Projected Contours on Multiple Planes for 3D data exploration.
These techniques enable you to create insightful 3D contour visualizations, enhancing your ability to explore and present complex three-dimensional data effectively.