Matplotlib 3D 线图

Matplotlib 3D 线图函数

在二维平面中,线图用于展示数据点之间的变化趋势。而在三维空间里,3D 线图可以展示一条曲线随着 x、y、z 三个变量的变化轨迹,比如:

  • 一颗卫星绕地球运动的轨迹。
  • 一个物体的运动曲线。
  • 某个函数的参数方程。

在 Matplotlib 中,我们可以使用 plot() 函数在 3D 坐标系中绘制线图。

语法:

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.add_subplot(projection='3d')

ax.plot(
    xs,
    ys,
    zs,
    zdir='z',
    *args,
    **kwargs
)

说明:

如果想要使用 3D 线图,我们需要先从 mpl_toolkits.mplot3d 导入 Axes3D 类,然后使用 add_subplot() 函数创建一个 3D 的子图,最后再调用 plot() 函数来创建 3D 线图。

其中,plot() 函数接收以下参数。

  • xs(必选):是一维数组列表,表示线图上点的 x 坐标。
  • ys(必选):是一维数组或列表,表示线图上点的 y 坐标。
  • zs(必选):是一维数组或列表,表示线图上点的 z 坐标。xs、ys 和 zs 的长度必须相同,代表了线上的连续点。
  • zdir(可选):用于指定哪个方向作为 z 轴。默认为 'z',也可以设置为 'x' 或 'y'。这通常用于在 2D 平面上投影 3D 线图。
  • *args(可选):其他传递给 plot() 函数的位置参数,例如颜色、线型、标记等,与 2D 线图的用法类似。
  • **kwargs(可选):其他传递给 plot() 函数的关键字参数,例如 label(标签)、linewidth(线宽)、linestyle(线型)、marker(标记)等。

Matplotlib 3D 线图示例

接下来,我们通过几个简单例子来介绍一下 Matplotlib 是如何绘制 3D 线图的。

示例 1:绘制基本的 3D 线图

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

# 设置
plt.rcParams['font.family'] = ['SimHei', 'PingFang SC']
plt.rcParams['axes.unicode_minus'] = False
fig = plt.figure()
ax = fig.add_subplot(projection='3d')

# 生成一些示例数据
t = np.linspace(0, 4 * np.pi, 100)
z = np.cos(t)
x = np.sin(t)
y = t

# 绘制 3D 线图
ax.plot(x, y, z)

# 设置标题和标签
ax.set_title('3D 线图')
ax.set_xlabel('X 轴')
ax.set_ylabel('Y 轴')
ax.set_zlabel('Z 轴')

# 显示
plt.show()

运行之后,效果如下图所示。

Matplotlib 基本 3D 线图

分析:

在这个例子中,我们首先创建了一个 3D 的子图,使用 np.linspace() 函数生成了一系列均匀分布的点作为参数 t。

接着,我们使用参数方程定义了 x、y 和 z 坐标,这些坐标随着 t 的变化而形成一条螺旋线。最后,再调用 ax.plot(x, y, z) 函数来绘制这条 3D 线图。

示例 2:自定义线图的颜色和线型

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

# 设置
plt.rcParams['font.family'] = ['SimHei', 'PingFang SC']
plt.rcParams['axes.unicode_minus'] = False
fig = plt.figure()
ax = fig.add_subplot(projection='3d')

# 生成数据
t = np.linspace(0, 10, 50)
x = np.cos(t)
y = np.sin(t)
z = t

# 绘制 3D 线图,自定义颜色和线型
ax.plot(x, y, z, color='green', linestyle='--', linewidth=2)

# 设置标题和标签
ax.set_title('3D 线图')
ax.set_xlabel('X 轴')
ax.set_ylabel('Y 轴')
ax.set_zlabel('Z 轴')

# 显示
plt.show()

运行之后,效果如下图所示。

Matplotlib 自定义 3D 线图的步长和颜色

分析:

这里我们使用 color 参数设置线条颜色为绿色,使用 linestyle 参数设置线型为虚线 ('--'),并使用 linewidth 参数设置线宽为 2。这些参数与 2D 线图中的用法是完全一致的。

示例 3:添加标记

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

# 设置
plt.rcParams['font.family'] = ['SimHei', 'PingFang SC']
plt.rcParams['axes.unicode_minus'] = False
fig = plt.figure()
ax = fig.add_subplot(projection='3d')

# 生成数据
t = np.linspace(0, 4 * np.pi, 20) # 使用较少的点来显示标记
z = np.cos(t)
x = np.sin(t)
y = t

# 绘制 3D 线图并添加圆形标记
ax.plot(x, y, z, marker='o', markersize=5, markerfacecolor='red')

# 设置标题和标签
ax.set_title('3D 线图')
ax.set_xlabel('X 轴')
ax.set_ylabel('Y 轴')
ax.set_zlabel('Z 轴')

# 显示
plt.show()

运行之后,效果如下图所示。

Matplotlib 绘制带有标记的 3D 线图

分析:

在这个例子中,我们通过 marker 参数设置标记为圆圈 ('o'),使用 markersize 设置标记大小,并使用 markerfacecolor 设置标记的填充颜色。通过减少 np.linspace() 生成的点数,我们可以更清晰地看到每个标记。

Matplotlib 3D 线图案例

为了更好地观察一个物体在三维空间中的运动轨迹,例如一个弹簧振子的运动。如果使用 3D 线图来展示,可以很好地帮助我们理解其在时间和空间上的变化。

示例 4:3D 线图的实际应用

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

# 设置
plt.rcParams['font.family'] = ['SimHei', 'PingFang SC']
plt.rcParams['axes.unicode_minus'] = False
fig = plt.figure()
ax = fig.add_subplot(projection='3d')

# 定义时间变量
t = np.linspace(0, 10 * np.pi, 500)

# 定义弹簧振子的运动方程
# x, y 轴是圆周运动,z 轴是随时间变化的线性运动
x = np.sin(t)
y = np.cos(t)
z = t

# 绘制 3D 轨迹线图
ax.plot(x, y, z, color='purple')

# 设置标题和标签
ax.set_title('3D 弹簧振子运动轨迹')
ax.set_xlabel('X 位置')
ax.set_ylabel('Y 位置')
ax.set_zlabel('时间')

# 显示
plt.show()

运行之后,效果如下图所示。

Matplotlib 3D 线图的实际应用

分析:

在这个例子中,我们模拟了一个弹簧振子在三维空间中的运动。其中,x 和 y 轴通过正弦和余弦函数描绘了一个圆周运动,而 z 轴则随着时间 t 线性增加。

ax.plot() 函数用于将这些连续的 (x, y, z) 坐标点连接起来,形成一条紫色的三维螺旋线,这样可以清晰地展示了弹簧振子随着时间推移的运动轨迹。

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号