Plotly单帧含多条3D散点迹的动画无法正常播放问题求解
Plotly 3D散点动画单帧多trace 修复方案
核心问题原因
- 初始化Figure的
data数组长度与单帧包含的trace数量不匹配:你每帧设置了2条trace,但初始data仅定义了1个空Scatter3d对象,Plotly动画默认按索引替换对应位置的初始trace,索引超出初始data长度的trace不会被渲染 TestTrace类中z轴数据长度与x、y不匹配:x和y设置为11个点,但生成z时未指定num参数,np.linspace默认生成50个点,长度不一致导致trace无法正常渲染- 未指定
Scatter3d的渲染模式,默认仅渲染标记点,你设置的line参数不会生效
修复后完整代码
import numpy as np import plotly.graph_objects as go def animationTest(frames): # 定义帧 frames=[ go.Frame( data=[ go.Scatter3d( x=trace.x, y=trace.y, z=trace.z, mode='lines', # 明确指定渲染线条 line=dict(width=2) ) for trace in frame], ) for frame in frames] # 定义画布 fig = go.Figure( # 初始data长度和单帧trace数量保持一致,这里是2条 data=[ go.Scatter3d(mode='lines', line=dict(width=2)), go.Scatter3d(mode='lines', line=dict(width=2)) ], layout=go.Layout( # 样式配置 scene=dict(), updatemenus=[ dict( type='buttons', buttons=[ dict( label='播放', method='animate', # 增加过渡配置让动画更流畅 args=[None, {"frame": {"duration": 300}, "transition": {"duration": 100}}] ) ] ) ] ), frames=frames ) fig.show() class TestTrace(): # 测试用3D数据 def __init__(self,ind): self.x = np.linspace(-5.,5.,11) self.y = ind*np.linspace(-5.,5.,11) # 修正z轴点数和x、y一致,都是11个 self.z = np.linspace(-5.,5.,11) fps = np.linspace(1.,10.,11) inds = [-2,2] # 生成每帧的trace数据 frames = [[TestTrace(ind=f*ind) for ind in inds] for f in fps] animationTest(frames)
验证说明
运行上述代码后会生成包含2条动态3D线的动画,点击播放按钮即可正常播放,两条线的斜率会随帧变化同步更新。
内容的提问来源于stack exchange,提问作者user14893379
相关产品推荐
相关产品推荐

