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
相关产品推荐
相关产品推荐

