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

如何用滑块在Python的Plotly中实现逐点累加绘制?

实现Plotly滑块拖动时保留历史散点

当前用Plotly Express的animation_frame做动画时,默认只显示当前帧的单个点,要实现拖动滑块时保留之前所有已绘制的点,有两种可行方案:

方案一:手动构建Graph Objects动画(无冗余数据)

这种方法通过为每个滑块位置生成累积数据帧,直接控制每帧显示的内容,不会产生数据冗余,适合数据集较大的场景。

import pandas as pd
import plotly.graph_objects as go

# 读取或定义数据(替换成你的file.xlsx数据)
df = pd.DataFrame({
    "$R[\Omega]$": [-0.092034, -0.096416, -0.103026],
    "$X[\Omega]$": [0.045707, 0.047590, 0.039953],
    "t[seg]": [0.416244, 0.417078, 0.417912]
})

# 按时间排序,确保累积顺序正确
df = df.sort_values("t[seg]").reset_index(drop=True)

# 生成每个滑块位置对应的累积数据帧
frames = []
for i in range(len(df)):
    # 取从第0行到当前行的所有数据
    cumulative_data = df.iloc[:i+1]
    frames.append(go.Frame(
        data=[go.Scatter(
            x=cumulative_data["$R[\Omega]$"],
            y=cumulative_data["$X[\Omega]$"],
            mode="markers",
            marker=dict(color="#1f77b4")
        )],
        name=str(df["t[seg]"].iloc[i])
    ))

# 创建初始图表(显示第一个点)
fig = go.Figure(
    data=[go.Scatter(
        x=df.iloc[:1]["$R[\Omega]$"],
        y=df.iloc[:1]["$X[\Omega]$"],
        mode="markers",
        marker=dict(color="#1f77b4")
    )],
    layout=go.Layout(
        title="$U_1/I_1$",
        xaxis_title="$R[\Omega]$",
        yaxis_title="$X[\Omega]$",
        # 可选:添加播放按钮,不需要可注释掉
        updatemenus=[dict(
            type="buttons",
            buttons=[dict(label="播放",
                          method="animate",
                          args=[None, dict(frame=dict(duration=500, redraw=True),
                                           fromcurrent=True)])]
        )]
    ),
    frames=frames
)

# 添加滑块控件
fig.update_layout(
    sliders=[dict(
        steps=[dict(
            method="animate",
            args=[[str(df["t[seg]"].iloc[i])],
                  dict(mode="immediate", frame=dict(duration=500, redraw=True))],
            label=f"{df['t[seg]'].iloc[i]:.6f}"
        ) for i in range(len(df))],
        currentvalue=dict(prefix="当前时间: ")
    )]
)

# 移除默认播放按钮(如果不需要)
# fig["layout"].pop("updatemenus")

fig.show()

方案二:修改数据集后用Plotly Express(简洁)

这种方法通过复制数据,让每个时间帧包含从初始到当前的所有点,代码更简洁,但会产生重复数据,适合小数据集。

import pandas as pd
import plotly.express as px

# 读取或定义数据
df = pd.DataFrame({
    "$R[\Omega]$": [-0.092034, -0.096416, -0.103026],
    "$X[\Omega]$": [0.045707, 0.047590, 0.039953],
    "t[seg]": [0.416244, 0.417078, 0.417912]
})

# 生成累积数据集:每个时间点t对应所有<=t的点
cumulative_rows = []
for current_t in df["t[seg]"].sort_values():
    # 筛选所有时间小于等于当前t的数据
    subset = df[df["t[seg]"] <= current_t]
    # 为筛选出的每条数据标记当前时间帧
    for _, row in subset.iterrows():
        cumulative_rows.append({
            "$R[\Omega]$": row["$R[\Omega]$"],
            "$X[\Omega]$": row["$X[\Omega]$"],
            "t[seg]": current_t
        })

cumulative_df = pd.DataFrame(cumulative_rows)

# 用Plotly Express生成动画
fig = px.scatter(cumulative_df, x="$R[\Omega]$", y="$X[\Omega]$", 
                 title="$U_1/I_1$", animation_frame="t[seg]")
# 移除播放按钮(按需保留)
fig["layout"].pop("updatemenus")
fig.show()

两种方案对比

  • 方案一:数据无冗余,性能更优,自定义性强(可调整标记样式、滑块逻辑等),但代码量稍大
  • 方案二:代码简洁易理解,适合快速实现,但数据量会随时间点数量线性增长

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 11:10:39