Plot3D
Like 2D plot, in 3D as well you would have most of functions that you can get from Matlab.
Draw a line between two points
This show how to draw a single line from (-1,-2,-3) to (1,2,3)
Filename : Line3D.py
|
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d.axes3d as axes3d
fig = plt.figure()
ax = fig.add_subplot(1,1,1, projection='3d')
ax.plot([-1,1],[-2,2],[-3,3],'r--')
ax.set_xlim3d(-5, 5)
ax.set_ylim3d(-5, 5)
ax.set_zlim3d(-5, 5)
plt.show()
|
Result : |
|
Drawing lines connecting multiple points
This show how to draw the line traces connecting multiple points
Filename : Line3D.py
|
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d.axes3d as axes3d
fig = plt.figure()
ax = fig.add_subplot(1,1,1, projection='3d')
xList = [0,1,2,3,4]
yList = [-1,1,-1,1,-1]
zList = [2,-2,2,-2,2]
ax.plot(xList, yList, zList,'b')
ax.set_xlim3d(-5, 5)
ax.set_ylim3d(-5, 5)
ax.set_zlim3d(-5, 5)
plt.show()
|
Result : |
|
3D Parametric Plot
This show how to draw 3d Parameteric Plot
Filename : Line3D.py
|
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d.axes3d as axes3d
fig = plt.figure()
ax = fig.add_subplot(1,1,1, projection='3d')
t = np.linspace(0, 4 * np.pi, 100)
x = t
y = np.cos(t)
z = np.sin(t)
ax.plot(x, y, z,'b')
ax.set_xlim3d(0, t.max())
ax.set_ylim3d(-2, 2)
ax.set_zlim3d(-2, 2)
plt.show()
|
Result : |
|
Surface Plot
This show how to draw 3d Parameteric Plot
Filename : plot3d_surce_01.py
|
import numpy as np
import matplotlib.pyplot as plt
# generate some sample data
X, Y = np.meshgrid(np.linspace(-10, 10, 100), np.linspace(-10, 10, 100))
Z = np.sin(np.sqrt(X**2 + Y**2))
# create the plot
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, Z, cmap='viridis')
# add labels and show the plot
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
plt.show()
|
Result : |
|
Contour Plot
This show how to draw 3d Contour Plot
Filename : plot3d_contour_01.py
|
import numpy as np
import matplotlib.pyplot as plt
# generate some sample data
X, Y = np.meshgrid(np.linspace(-10, 10, 100), np.linspace(-10, 10, 100))
Z = np.sin(np.sqrt(X**2 + Y**2))
# create the plot
fig, ax = plt.subplots()
# plot filled contours
c = ax.contourf(X, Y, Z)
# add colorbar and labels
cb = fig.colorbar(c)
ax.set_xlabel('X')
ax.set_ylabel('Y')
plt.show()
|
Result : |
|
Removing Surface Color
This show how to remove the surface color. Use contour() function instead of contourf().
Filename : plot3d_contour_01.py
|
import numpy as np
import matplotlib.pyplot as plt
# generate some sample data
X, Y = np.meshgrid(np.linspace(-10, 10, 100), np.linspace(-10, 10, 100))
Z = np.sin(np.sqrt(X**2 + Y**2))
# create the plot
fig, ax = plt.subplots()
# plot contours with single color or grayscale colormap
plt.contour(X, Y, Z, cmap='jet')
plt.colorbar()
# add labels
ax.set_xlabel('X')
ax.set_ylabel('Y')
plt.show()
|
Result : |
|
Changing Contour Level
Filename : plot3d_contour_01.py
|
import numpy as np
import matplotlib.pyplot as plt
# generate some sample data
X, Y = np.meshgrid(np.linspace(-10, 10, 100), np.linspace(-10, 10, 100))
Z = np.sin(np.sqrt(X**2 + Y**2))
# create the plot
fig, ax = plt.subplots()
# plot contours with single color or grayscale colormap
levels = [-1.0, -0.5, 0, 0.5, 1.0]
plt.contour(X, Y, Z, levels=levels)
plt.colorbar()
# add labels
ax.set_xlabel('X')
ax.set_ylabel('Y')
plt.show()
|
Result : |
|
Printing Contour Level
Filename : plot3d_contour_01.py
|
import numpy as np
import matplotlib.pyplot as plt
# generate some sample data
X, Y = np.meshgrid(np.linspace(-10, 10, 100), np.linspace(-10, 10, 100))
Z = np.sin(np.sqrt(X**2 + Y**2))
# create the plot
fig, ax = plt.subplots()
# plot contours with single color or grayscale colormap
levels = [-1.0, -0.5, 0, 0.5, 1.0]
contours = plt.contour(X, Y, Z, levels=levels)
plt.clabel(contours, inline=True, fontsize=8, fmt='%1.1f')
plt.colorbar()
# add labels
ax.set_xlabel('X')
ax.set_ylabel('Y')
plt.show()
|
Result : |
|
Ticks, Tick Mark, Axis Label
This show how to format tick mark,tick label,axis label
Filename : Line3D.py
|
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d.axes3d as axes3d
fig = plt.figure()
ax = fig.add_subplot(1,1,1, projection='3d')
t = np.linspace(0, 4 * np.pi, 100)
x = t
y = np.cos(t)
z = np.sin(t)
ax.plot(x, y, z,'b')
ax.set_xlim3d(0, t.max())
ax.set_ylim3d(-2, 2)
ax.set_zlim3d(-2, 2)
ax.set_xlabel('x', fontsize=15, rotation=0)
ax.set_ylabel('y', fontsize=15, rotation=0)
ax.set_zlabel('z', fontsize=15, rotation=90)
ax.xaxis.set_ticks([0,np.pi,2*np.pi,3*np.pi,4*np.pi])
ax.set_xticklabels([0,'$\pi$','2$\pi$','3$\pi$','4$\pi$'])
ax.yaxis.set_ticks([-2,-1,0,1,2])
ax.zaxis.set_ticks([-2,-1,0,1,2])
plt.show()
|
Result : |
|
Turn Off Axis, Axis Labels, Grid
Filename : Line3D.py
|
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d.axes3d as axes3d
fig = plt.figure()
ax = fig.add_subplot(1,1,1, projection='3d')
t = np.linspace(0, 4 * np.pi, 100)
x = t
y = np.cos(t)
z = np.sin(t)
ax.plot(x, y, z,'b')
ax.set_xlim3d(0, t.max())
ax.set_ylim3d(-2, 2)
ax.set_zlim3d(-2, 2)
ax.set_xlabel('x', fontsize=15, rotation=0)
ax.set_ylabel('y', fontsize=15, rotation=0)
ax.set_zlabel('z', fontsize=15, rotation=90)
ax.xaxis.set_ticks([0,np.pi,2*np.pi,3*np.pi,4*np.pi])
ax.set_xticklabels([0,'$\pi$','2$\pi$','3$\pi$','4$\pi$'])
ax.yaxis.set_ticks([-2,-1,0,1,2])
ax.zaxis.set_ticks([-2,-1,0,1,2])
ax.grid(False)
ax.axis('off')
ax.set_xticks([])
ax.set_yticks([])
ax.set_zticks([])
plt.show()
|
Result : |
|
Color map
For most of 3D surface plot, you may not need to worry much about the colormap because the default color map would be good enough unless you have any specific preferance of your own. However for the 3D surface plot in spherical coordinate you may want to apply different colormap. In default colormap in 3d surface plot, the surface color changes as the value in Z axis varies, but in spherical plot it would be more meaning to change color of the surface as the value in Radial axis varies. This is an example of showing the color variation along with radial axis (not along with Z axis).
cmap in Spherical Coordinate
Filename : plot3d_spherical_color_01.py
|
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
from mpl_toolkits.mplot3d import Axes3D
# Generate spherical coordinates
phi = np.linspace(0, np.pi, 100)
theta = np.linspace(0, 2 * np.pi, 100)
PHI, THETA = np.meshgrid(phi, theta)
R = (np.sin(PHI) ** 2) * np.cos(2 * THETA)
# Convert spherical coordinates to cartesian coordinates
X = R * np.sin(PHI) * np.cos(THETA)
Y = R * np.sin(PHI) * np.sin(THETA)
Z = R * np.cos(PHI)
# Normalize r for color encoding
normalized_r = np.abs(R)
normalized_r = (normalized_r - normalized_r.min()) / (normalized_r.max() - normalized_r.min())
# Define a colormap that maps normalized r to red or blue
cmap = cm.get_cmap('RdBu_r')
colors = cmap(normalized_r)
# Plot the surface
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, Z, facecolors=colors, linewidth=0)
ax.set_xlabel(r'$X$')
ax.set_ylabel(r'$Y$')
ax.set_zlabel(r'$Z$')
plt.show()
|
Result : |
|
cmap in Cartesian Coordinate
If you apply the color map to cartesian surface plot, it become a little bit simple as below.
Filename : plot3d_surce_01_cmap.py
|
import numpy as np
import matplotlib.pyplot as plt
# generate some sample data
X, Y = np.meshgrid(np.linspace(-10, 10, 100), np.linspace(-10, 10, 100))
Z = np.sin(np.sqrt(X**2 + Y**2))
# create the plot
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# create custom colormap
cmap = plt.cm.get_cmap('seismic')
# plot surface using custom colormap
ax.plot_surface(X, Y, Z, cmap=cmap)
# add labels and show the plot
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
plt.show()
|
Result : |
|
Setting Transparency
If you can change transparency of the surface color as shown below.
Filename : plot3d_surce_01_cmap.py
|
import numpy as np
import matplotlib.pyplot as plt
# generate some sample data
X, Y = np.meshgrid(np.linspace(-10, 10, 100), np.linspace(-10, 10, 100))
Z = np.sin(np.sqrt(X**2 + Y**2))
# create the plot
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# plot surface with transparency
ax.plot_surface(X, Y, Z, cmap='viridis', alpha=0.5)
# add labels and show the plot
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
plt.show()
|
Result : |
|
Reference :
[1] Matplotlib tutorial (Nicolas P. Rougier)
|
|