如何在 matplotlib 图中添加 3D 子图?
在数据可视化中,三维图形常常被用来展示高维数据。而 matplotlib 是 Python 中最流行的绘图库之一,它提供了很多绘制三维图形的工具,其中包括 mplot3d
模块。在 matplotlib 图中添加 3D 子图,可以让我们以一种更加直观的方式展示数据,并且能够更好地理解数据之间的关系。
了解 mplot3d 模块
在使用 mplot3d
模块前,首先需要 import 它:
from mpl_toolkits import mplot3d
# 也可以直接 import mplot3d:
# import mpl_toolkits.mplot3d as mplot3d
然后,我们需要创建一个包含 3D 子图的 Axes3D 对象。此外,我们还要用 figure
函数创建一个图形对象,并用 add_subplot
函数将 Axes3D 对象添加到图形上。最后,我们调用 plot
函数将绘图的数据添加到 Axes3D 对象上。
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# 绘制 3D 折线图
x = np.random.rand(10)
y = np.random.rand(10)
z = np.random.rand(10)
ax.plot(x, y, z)
# 显示图形
plt.show()
运行上述代码,我们可以得到一个简单的 3D 折线图。
绘制 3D 散点图
绘制 3D 散点图可以使用 scatter
函数来实现。以下是一个示例代码:
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# 绘制 3D 散点图
x = np.random.rand(10)
y = np.random.rand(10)
z = np.random.rand(10)
ax.scatter(x, y, z)
# 显示图形
plt.show()
上述代码会生成一个 3D 散点图。我们可以在 x、y、z 轴上放置数据点,使它们组成一个三维空间的图形。
绘制 3D 柱状图
bar
函数可以用于绘制三维柱状图。以下是一个示例代码:
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# 绘制 3D 柱状图
x = np.arange(10)
y = np.arange(10)
z = np.zeros(10)
dx = 0.5 * np.ones(10)
dy = 0.5 * np.ones(10)
dz = np.random.rand(10)
ax.bar3d(x, y, z, dx, dy, dz)
# 显示图形
plt.show()
上述代码会生成一个随机高度的 3D 柱状图。我们可以看到在三维空间中有十个柱子。
绘制 3D 曲面图
plot_surface
函数可以用于绘制 3D 曲面图。以下是一个示例代码:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# 绘制 3D 曲面图
x = np.linspace(-5, 5, 50)
y = np.linspace(-5, 5, 50)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X ** 2 + Y ** 2))
ax.plot_surface(X, Y, Z)
# 显示图形
plt.show()
上述代码会生成一个 sin 函数的 3D 曲面图。我们可以看到这个图形在三维空间中有许多起伏。
设置 3D 子图的角度和视角
我们可以用 view_init
函数调整 3D 子图的角度和视角。以下是一个示例代码:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# 绘制 3D 曲面图
x = np.linspace(-5, 5, 50)
y = np.linspace(-5, 5, 50)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X ** 2 + Y ** 2))
ax.plot_surface(X, Y, Z)
# 设置视角和角度
ax.view_init(60, 35)
# 显示图形
plt.show()
上述代码会生成一个 sin 函数的 3D 曲面图,并且将视角调整为距离原点较远的位置,从而更好地观察曲面的形状。
添加坐标轴标签和标题
我们可以用 set_xlabel
、set_ylabel
和 set_zlabel
函数分别为 x、y 和 z 轴添加标签,用 set_title
函数添加图形标题。以下是一个示例代码:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# 绘制 3D 曲面图
x = np.linspace(-5, 5, 50)
y = np.linspace(-5, 5, 50)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X ** 2 + Y ** 2))
ax.plot_surface(X, Y, Z)
# 添加 x、y、z 标签和标题
ax.set_xlabel('X Label')
ax.set_ylabel('Y Label')
ax.set_zlabel('Z Label')
ax.set_title('3D Surface Plot')
# 显示图形
plt.show()
上述代码会生成一个包含 x、y、z 标签和标题的 3D 曲面图。
结论
在 matplotlib 图中添加 3D 子图可以帮助我们更好地理解高维数据之间的关系。通过使用 mplot3d
模块和各种绘图函数,我们可以轻松地创建 3D 折线图、散点图、柱状图、曲面图等各种类型的图形。我们还可以使用 view_init
函数对角度和视角进行调整,使用 set_xlabel
、set_ylabel
、set_zlabel
和 set_title
函数为图形添加标签和标题。