Note
Go to the end to download the full example code.
3D box surface plot#
Given data on a gridded volume X, Y, Z, this example plots the
data values on the volume surfaces.
The strategy is to select the data from each surface and plot
contours separately using axes3d.Axes3D.contourf with appropriate
parameters zdir and offset.
import matplotlib.pyplot as plt import numpy as np # Define dimensions Nx, Ny, Nz = 100, 300, 500 X, Y, Z = np.meshgrid(np.arange(Nx), np.arange(Ny), -np.arange(Nz)) # Create fake data data = (((X+100)**2 + (Y-20)**2 + 2*Z)/1000+1) kw = { 'vmin': data.min(), 'vmax': data.max(), 'levels': np.linspace(data.min(), data.max(), 10), } # Create a figure with 3D ax fig = plt.figure(figsize=(5, 4)) ax = fig.add_subplot(111, projection='3d') # Plot contour surfaces _ = ax.contourf( X[:, :, 0], Y[:, :, 0], data[:, :, 0], zdir='z', offset=0, **kw ) _ = ax.contourf( X[0, :, :], data[0, :, :], Z[0, :, :], zdir='y', offset=0, **kw ) C = ax.contourf( data[:, -1, :], Y[:, -1, :], Z[:, -1, :], zdir='x', offset=X.max(), **kw ) # -- # Set limits of the plot from coord limits xmin, xmax = X.min(), X.max() ymin, ymax = Y.min(), Y.max() zmin, zmax = Z.min(), Z.max() ax.set(xlim=(xmin, xmax), ylim=(ymin, ymax), zlim=(zmin, zmax)) # Plot edges edges_kw = dict(color='0.4', linewidth=1, zorder=1e3) ax.plot([xmax, xmax], [ymin, ymax], 0, **edges_kw) ax.plot([xmin, xmax], [ymin, ymin], 0, **edges_kw) ax.plot([xmax, xmax], [ymin, ymin], [zmin, zmax], **edges_kw) # Set labels and zticks ax.set( xlabel='X [km]', ylabel='Y [km]', zlabel='Z [m]', zticks=[0, -150, -300, -450], ) # Set zoom and angle view ax.view_init(40, -30, 0) ax.set_box_aspect(None, zoom=0.9) # Colorbar fig.colorbar(C, ax=ax, fraction=0.02, pad=0.1, label='Name [units]') # Show Figure plt.show()

Tags: plot-type: 3D level: intermediate
Total running time of the script: (0 minutes 4.064 seconds)