目录
可视化涉及三个变量的数据通常需要三维绘图,以便更好地理解二维绘图无法揭示的复杂关系和模式。Python的Matplotlib库通过其mpl_toolkits.mplot3d工具包,为三维可视化提供了强大的支持。要开始创建三维绘图,第一个关键步骤是通过在绘图轴上启用三维投影来设置三维绘图环境。例如:
import matplotlib.pyplot as plt
fig = plt.figure()
ax = plt.axes(projection='3d')
plt.show()
- • plt.figure() 创建一个新的图形对象,它是所有绘图元素的容器。
- • fig.add_subplot(111, projection='3d') 向图形中添加一组启用了 3D 投影的坐标轴。111 表示“1 行,1 列,第一个子图”。
- • plt.show() 渲染绘图窗口,显示 3D 坐标轴。
使用Matplotlib进行3D绘图的示例
1. 三维线图
三维线图连接三维空间中的点,以可视化一条连续的路径。它对于展示一个变量在三维空间中如何随时间或空间演变很有用。此示例使用正弦和余弦函数绘制一条螺旋路径。
from mpl_toolkits import mplot3d
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax = plt.axes(projection='3d')
z = np.linspace(0, 1, 100)
x = z * np.sin(25 * z)
y = z * np.cos(25 * z)
ax.plot3D(x, y, z, 'green')
ax.set_title('3D Line Plot')
plt.show()
我们使用np.linspace()在0到1之间生成100个点作为z,然后计算x = z * np.sin(25z)和y = z * np.cos(25z)以形成一个螺旋线。使用ax.plot3D(x, y, z, 'green')绘制三维螺旋线。
2. 三维散点图
三维散点图在三个维度上显示单个数据点,有助于发现趋势或聚类。每个点代表一个具有(x,y,z)值的点,颜色可用于添加第四个维度。
fig = plt.figure()
ax = plt.axes(projection='3d')
z = np.linspace(0, 1, 100)
x = z * np.sin(25 * z)
y = z * np.cos(25 * z)
c = x + y # Color array based on x and y
ax.scatter(x, y, z, c=c)
ax.set_title('3D Scatter Plot')
plt.show()
使用相同的x、y和z值,ax.scatter() 绘制单个3D点。颜色由c = x + y设置,添加了第四个维度以可视化各点之间的变化。
3. 曲面图
曲面图展示了一个平滑的曲面,它跨越(x,y)值的网格,并由z值塑造形状。它们非常适合可视化具有两个变量的函数,能清晰呈现数据的分布形态。
x = np.outer(np.linspace(-2, 2, 10), np.ones(10))
y = x.copy().T
z = np.cos(x**2 + y**3)
fig = plt.figure()
ax = plt.axes(projection='3d')
ax.plot_surface(x, y, z, cmap='viridis', edgecolor='green')
ax.set_title('Surface Plot')
plt.show()
我们使用np.outer()创建一个包含x和y的网格,然后计算z = np.cos(x2 + y3)。使用ax.plot_surface()可视化该曲面,其中cmap='viridis'用于设置颜色,edgecolor='green'用于设置网格线颜色。
4. 线框绘图
线框绘图类似于曲面绘图,但只显示曲面的边缘或“框架”。它有助于理解三维曲面的结构,而不会因颜色填充而分心。
def f(x, y):
return np.sin(np.sqrt(x**2 + y**2))
x = np.linspace(-1, 5, 10)
y = np.linspace(-1, 5, 10)
X, Y = np.meshgrid(x, y)
Z = f(X, Y)
fig = plt.figure()
ax = plt.axes(projection='3d')
ax.plot_wireframe(X, Y, Z, color='green')
ax.set_title('Wireframe Plot')
plt.show()
我们定义
,为x和y生成一个网格,并计算z值。使用ax.plot_wireframe(),我们将三维曲面渲染为绿色线框。
5. 三维等高线图
将三维曲面与等高线相结合,以突出海拔或深度。它有助于在三维空间中更清晰地可视化函数的形状和梯度变化。
def fun(x, y):
return np.sin(np.sqrt(x**2 + y**2))
x = np.linspace(-10, 10, 40)
y = np.linspace(-10, 10, 40)
X, Y = np.meshgrid(x, y)
Z = fun(X, Y)
fig = plt.figure(figsize=(10, 8))
ax = plt.axes(projection='3d')
ax.plot_surface(X, Y, Z, cmap='cool', alpha=0.8)
ax.set_title('3D Contour Plot')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
plt.show()
6. 3D曲面图
使用三角网格从离散或网格数据构建三维表面。当表面不规则或使用非矩形网格时,这种方法非常理想。
from matplotlib.tri import Triangulation
def f(x, y):
return np.sin(np.sqrt(x**2 + y**2))
x = np.linspace(-6, 6, 30)
y = np.linspace(-6, 6, 30)
X, Y = np.meshgrid(x, y)
Z = f(X, Y)
tri = Triangulation(X.ravel(), Y.ravel())
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
ax.plot_trisurf(tri, Z.ravel(), cmap='cool', edgecolor='none', alpha=0.8)
ax.set_title('Surface Triangulation Plot')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
plt.show()
在定义函数并使用np.meshgrid()生成x和y之后,我们使用.ravel()将它们展平,并创建一个Triangulation对象。使用颜色映射和透明度通过ax.plot_trisurf()绘制曲面。
7. 莫比乌斯带图
莫比乌斯带是一种带有扭转的单侧曲面,是拓扑学中一个著名的概念。此图展现了它的三维几何形状,展示了数学与艺术如何美妙地融合。
R = 2
u = np.linspace(0, 2*np.pi, 100)
v = np.linspace(-1, 1, 100)
u, v = np.meshgrid(u, v)
x = (R + v * np.cos(u / 2)) * np.cos(u)
y = (R + v * np.cos(u / 2)) * np.sin(u)
z = v * np.sin(u / 2)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(x, y, z, alpha=0.5)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
ax.set_title('Möbius Strip')
ax.set_xlim([-3, 3])
ax.set_ylim([-3, 3])
ax.set_zlim([-3, 3])
plt.show()