3D Visualization#

You can create a 3D axis by projection='3d' option.

import numpy as np
import matplotlib.pyplot as plt

The magic command %matplotlib notebook allows you to interactively change the viewpoint by clicking and dragging.
But for this static book, we use regular inline mode.

#%matplotlib notebook  
%matplotlib inline

Lines and Points in 3D#

# spiral data
x = np.linspace(0, 20, 100)
y = x*np.sin(x)
z = x*np.cos(x)
# create a figure and 3D axes
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
ax.plot(x, y, z)
[<mpl_toolkits.mplot3d.art3d.Line3D at 0x10d8d1640>]
_images/8bba08d511fb3fec916e9a0f9b01eb8af1a463e1ab70e6861059a46ddc94ba1b.png
# You can make a figure and an axis in one line:
ax = plt.figure().add_subplot(projection='3d')
# scatter plot with x value mapped to color
ax.scatter(x, y, z, c=x)
<mpl_toolkits.mplot3d.art3d.Path3DCollection at 0x10d92fa40>
_images/ab37460e618ef8f22992610129f4eacc2e16e00f321aae68328dbe5323dc237e.png

surface plot#

x = np.linspace(-5, 5, 25)
y = np.linspace(-5, 5, 25)
X, Y = np.meshgrid(x, y)
Z = X*Y
ax = plt.figure().add_subplot(projection='3d')
ax.plot_surface(X, Y, Z)
<mpl_toolkits.mplot3d.art3d.Poly3DCollection at 0x10d8069f0>
_images/bfab31859764a6a0c8fef4b8834bb33f53032de4a1d848911dfc83c2e4967ceb.png

You can color the surface by the height.

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# map Z value to 'viridis' colormap
ax.plot_surface(X, Y, Z, cmap='viridis');
_images/29b13f759407ddb63a281ae531e8b12b138c8505f603465e1b3ea4255a9dfaf5.png

surface by wire frame#

# make a 3D axis in one line
ax = plt.figure().add_subplot(111, projection='3d')
# wireframe plot
ax.plot_wireframe(X, Y, Z)
<mpl_toolkits.mplot3d.art3d.Line3DCollection at 0x10dbaa4b0>
_images/0094c36078d60f3db68eb2f6e624998c7cebfd403b5760240443cf058ed18b6a.png

3D vector field by quiver( )#

x = np.linspace(-5, 5, 10)
y = np.linspace(-5, 5, 10)
z = np.linspace(-5, 5, 10)
X, Y, Z = np.meshgrid(x, y, z)
#print(X)
# tornado
U = Y*Z  # dx/dt
V = -X*Z # dy/dt
W = Z   # dz/dt
ax = plt.figure().add_subplot(111, projection='3d')
ax.quiver(X, Y, Z, U, V, W, length=0.1)
<mpl_toolkits.mplot3d.art3d.Line3DCollection at 0x10dba95b0>
_images/a22b441e1e1902453e034791ac27c822ad5e613cae8d609f4255c5e0ab7c2826.png

For more advanced 3D visualization, you may want to use a specialized library like mayavi https://docs.enthought.com/mayavi/mayavi/