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

如何用Plotly滑块展示从初始到当前步骤的完整正弦曲线

问题:用Plotly展示带滑块的累积正弦曲线

需求:使用Plotly展示2条正弦曲线,通过滑块展示从time=0到当前滑块步骤的完整曲线。

尝试的原始代码:

import numpy as np
import pandas as pd
import plotly.express as px  # 原代码遗漏导入px,此处补充

if __name__ == "__main__":

    time    = np.arange(0, 10, 0.1)
    val1    = np.sin(time)
    val2    = np.sin(time) * np.sin(time)

    df          = pd.DataFrame(val1, columns=['val-1'])
    df['val-2'] = val2
    df['time'] = time  # 原代码未保留time作为x轴,此处补充

    fig = px.scatter(df, animation_frame=df.index)
    fig.update_layout(xaxis_range=[-100, 100])
    fig.update_layout(yaxis_range=[-1.1, 1.1])

    fig.show()

问题:当前代码仅显示两条正弦曲线的当前值(单个点),无法展示从step=0到当前步骤的完整曲线。


解决方案

原代码核心问题:

  1. 使用px.scatter搭配animation_frame=df.index,每帧仅显示当前索引对应的单个数据点,而非累积的所有点;
  2. 未将time作为x轴,导致x轴范围设置不合理,无法正确展示曲线趋势。

修改思路:

  • 构造累积式动画帧数据:每个帧对应从第0步到当前步的所有数据点;
  • 使用px.line绘制折线图,而非散点图,自然展示曲线的连续形态;
  • 将time设为x轴,保证曲线的x轴坐标正确。

修改后的代码:

import numpy as np
import pandas as pd
import plotly.express as px

if __name__ == "__main__":
    # 生成基础数据
    time = np.arange(0, 10, 0.1)
    val1 = np.sin(time)
    val2 = np.sin(time) ** 2  # 等价于原代码的np.sin(time)*np.sin(time)
    
    # 构造累积动画数据:每个frame对应到当前步的所有数据
    frames_data = []
    for i in range(len(time)):
        # 取前i+1个数据点(从0到当前步)
        frame_df = pd.DataFrame({
            'time': time[:i+1],
            'val-1': val1[:i+1],
            'val-2': val2[:i+1],
            'frame': i  # 标记当前帧的序号
        })
        frames_data.append(frame_df)
    
    # 合并所有帧的数据
    full_df = pd.concat(frames_data, ignore_index=True)
    
    # 绘制带动画的折线图
    fig = px.line(
        full_df,
        x='time',
        y=['val-1', 'val-2'],
        animation_frame='frame',
        labels={'value': '幅值', 'time': '时间'},
        title='累积正弦曲线动画'
    )
    
    # 设置坐标轴范围,避免动画过程中轴范围跳动
    fig.update_layout(
        xaxis_range=[0, max(time)],
        yaxis_range=[-1.1, 1.1],
        showlegend=True
    )
    
    # 优化动画速度和滑块显示
    fig.layout.updatemenus[0].buttons[0].args[1]['frame']['duration'] = 50
    fig.layout.sliders[0].currentvalue.prefix = '当前时间步:'
    
    fig.show()

代码说明:

  • 通过循环生成每个帧对应的累积数据,确保每一步都包含从起始到当前的所有点;
  • 使用px.line绘制两条曲线,动画帧切换时自动显示到当前步的完整折线;
  • 设置固定坐标轴范围,避免动画过程中轴范围频繁变化影响观感;
  • 调整动画时长和滑块显示文字,提升交互体验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 16:40:30