You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

matplotlib.animation绘制3D动画折线时为折线起点添加标签方法

3D动画折线固定起点标签实现方法

要给4条动态折线的起始位置加固定标签,不需要修改原有动画更新逻辑,直接调用3D轴的文本绘制方法在初始坐标位置放置标签即可——因为折线起点是固定值,固定起点标签不需要随动画帧刷新。

具体修改步骤

  • 提前定义4个对应标签的文本列表,按折线生成顺序匹配:labels = ['A', 'B', 'C', 'D']
  • 在初始化折线对象的代码块之后,遍历每条折线的首点坐标,调用ax.text()绘制标签。为了避免标签和线体重合遮挡,可以给x/y/z三个坐标都加0.02的微小偏移,让标签显示在起点旁的空白位置。
  • 如果后续需要让标签跟着折线动态移动的末端走,只需要把生成的文本对象存入列表,在update_lines更新函数里同步修改文本的坐标属性即可,当前需求为固定在起始位置的标签,不需要这步操作。

修改后完整可运行代码

import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d.axes3d as p3
import matplotlib.animation as animation

# 固定随机种子保证结果可复现
np.random.seed(19680801)


def Gen_RandLine(length, dims=2):
    """
    随机游走算法生成折线数据
    length: 折线包含的点数量
    dims: 折线维度
    """
    lineData = np.empty((dims, length))
    lineData[:, 0] = np.random.rand(dims)
    for index in range(1, length):
        # 步长缩放0.1保证移动幅度小于初始位置
        # 减0.5将随机值范围调整到[-0.5, 0.5],支持折线反向移动
        step = ((np.random.rand(dims) - 0.5) * 0.1)
        lineData[:, index] = lineData[:, index - 1] + step

    return lineData


def update_lines(num, dataLines, lines):
    for line, data in zip(lines, dataLines):
        # 注意:3d数据没有直接的.set_data()方法,需要单独设置z轴属性
        line.set_data(data[0:2, :num])
        line.set_3d_properties(data[2, :num])
    return lines

# 绑定3D轴到画布
fig = plt.figure()
ax = p3.Axes3D(fig)

# 生成4条3D随机折线数据
data = [Gen_RandLine(25, 3) for index in range(4)]
# 定义每条线对应的起点标签
line_labels = ['A', 'B', 'C', 'D']

# 初始化折线对象
# 注意:3d版本的plot()方法不能传入空数组
lines = [ax.plot(dat[0, 0:1], dat[1, 0:1], dat[2, 0:1])[0] for dat in data]

# 给每条折线的起点添加标签,加0.02偏移避免和线体重合遮挡
for label, dat in zip(line_labels, data):
    x0, y0, z0 = dat[0,0], dat[1,0], dat[2,0]
    ax.text(x0+0.02, y0+0.02, z0+0.02, label, fontsize=12, fontweight='bold')

# 设置坐标轴属性
ax.set_xlim3d([0.0, 1.0])
ax.set_xlabel('X')

ax.set_ylim3d([0.0, 1.0])
ax.set_ylabel('Y')

ax.set_zlim3d([0.0, 1.0])
ax.set_zlabel('Z')

ax.set_title('3D Test')

# 创建动画对象
line_ani = animation.FuncAnimation(fig, update_lines, 25, fargs=(data, lines),
                                   interval=50, blit=False)

plt.show()

运行后就能看到4条折线的起点旁固定显示A、B、C、D四个标签,不会随动画播放移位。

内容的提问来源于stack exchange,提问作者JTM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 21:51:36