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

Python中如何为Plotly动画散点图添加指定起止坐标的线段

Plotly动画散点图添加线段实现方案

你现有代码生成的是逐帧渲染的散点动画,加线段分两种场景处理即可:

1. 添加全局固定静态线段

如果线段是首攻线、码线这类全程位置不变的标记,直接调用add_shape接口追加即可,线段会默认在所有动画帧中持续显示,不需要额外修改帧配置:

# 接你原有散点图代码之后写
fig.add_shape(
    type="line",
    x0=x0, y0=y0, # 线段起点坐标
    x1=x1, y1=y1, # 线段终点坐标
    line=dict(
        color="#d00000", 
        width=3, 
        dash="dash" # 可选:solid实线、dash虚线、dot点线
    ),
    layer="below" # 线段放在散点图层下方,避免遮挡球员点位
)

如果需要给线段加文字标注,搭配add_annotation接口即可:

fig.add_annotation(
    x=x1, y=y1,
    text="首攻线",
    showarrow=False,
    xanchor="left",
    font=dict(color="#d00000")
)

2. 添加随帧变化的动态线段

如果是传球轨迹、球员推进路线这类位置随帧变化的线段,需要给每一个动画帧单独注入对应的线段配置,避免动画播放时线段消失:

# 第一步:提前整理好每一帧对应的线段坐标,key为frameId,value为对应帧的线段起终点坐标
# 按你实际的业务数据替换这里的映射关系即可
frame_line_config = {
    1: (15, 25, 35, 25),
    2: (15, 25, 38, 22),
    3: (15, 25, 42, 19),
    # ... 补全所有frameId对应的线段坐标
}

# 第二步:遍历所有动画帧,给每个帧追加对应线段
for frame in fig.frames:
    current_fid = int(frame.name) # px生成的帧name和animation_frame字段值一致,注意类型匹配
    lx0, ly0, lx1, ly1 = frame_line_config[current_fid]
    frame.layout.shapes = [
        dict(
            type="line",
            x0=lx0, y0=ly0,
            x1=lx1, y1=ly1,
            line=dict(color="#ff9e00", width=2),
            layer="below"
        )
    ]

# 第三步:给初始首帧补上线段,避免动画加载完成前第一帧不显示线段
first_fid = int(fig.frames[0].name)
flx0, fly0, flx1, fly1 = frame_line_config[first_fid]
fig.add_shape(
    type="line",
    x0=flx0, y0=fly0,
    x1=flx1, y1=fly1,
    line=dict(color="#ff9e00", width=2),
    layer="below"
)

提示:你之前已经设置了range_y = [-10, 60],足够覆盖NFL场地的y轴范围,加线段时如果x轴范围没有显式设置,建议补充range_x=[0,120]匹配标准场地尺寸,避免线段超出可视区域被裁切。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 02:54:40