讲师中心 微信公众号
AI工具推荐 视频效率加速

Plotly 中实现时间轴上按事件类型动态着色的矩形背景(支持离散事件映射)

轻浩姑娘_8207

轻浩姑娘_8207

发布时间:2026-03-03 19:40:02

|

806人浏览过

|

来源于php中文网

原创

Plotly 中实现时间轴上按事件类型动态着色的矩形背景(支持离散事件映射)

本文详解如何在 Plotly 图表中为时间序列数据(如眼动轨迹)添加与事件标签(e ∈ {0–5})严格对齐、颜色可区分的底部矩形背景,提供基于 add_shape 的逐段渲染与 Heatmap 高效替代两种专业方案。

本文详解如何在 plotly 图表中为时间序列数据(如眼动轨迹)添加与事件标签(e ∈ {0–5})严格对齐、颜色可区分的底部矩形背景,提供基于 `add_shape` 的逐段渲染与 `heatmap` 高效替代两种专业方案。

在可视化眼动追踪等时序行为数据时,常需将原始坐标(x, y)曲线与底层事件标注(如 e = 0 表示眨眼,1=注视,2=扫视等)同步呈现。理想效果是:在时间轴(t)下方或图底区域,用连续、无间隙、颜色随 e 值变化的矩形条直观标示各时刻所属事件类型。然而,Plotly 的 add_shape(type="rect") 不支持数组型 fillcolor——直接传入 e 或其映射色列表会触发 ValueError: Invalid value of type 'numpy.ndarray' received for the 'fillcolor' property。

✅ 方案一:使用 add_shape 逐段绘制(精确控制,适合中小规模数据)

核心思想是将整个时间区间 [t[0], t[-1]] 拆分为 len(e) 个等宽子区间(每个对应一个采样点),为每个区间单独添加一个矩形。关键在于正确计算每个矩形的 x0 和 x1 边界:

import numpy as np
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import plotly.express as px

# 示例数据(同问题中)
t = np.arange(30)
x = np.array([125.9529, 124.6142, 125.0569, 125.3117, 126.7498, 127.035, 125.4822, 125.6249, 126.9371, 127.6047, 
              129.031 , 128.2419, 121.521 , 114.7071, 109.4141, 100.5057,  94.9606,  95.2231, 95.9032,  96.4991, 
              101.2602, 103.9582, 108.2527, 108.8801, 110.3254, 112.8205, 113.0079, 113.3547, 113.0962, 113.2508])
y = np.array([31.218 , 31.236 , 31.147 , 31.2614, 30.806 , 30.8423, 31.727, 32.2256, 32.0504, 32.7774, 
              34.7089, 37.0671, 46.309 , 55.9716, 62.4481, 68.0248, 75.4912, 79.0622, 81.2176, 83.191 , 
              83.7656, 84.6713, 83.9343, 82.4546, 81.1652, 80.7981, 80.2136, 80.7405, 80.4398, 80.0738])
e = np.array([1., 1., 1., 1., 1., 1., 1., 1., 1., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 
              3., 3., 3., 3., 3., 3., 4., 4., 4., 4.])

# 创建主图(双曲线 + 底部事件条)
fig = make_subplots()
fig.add_trace(go.Scatter(x=t, y=x, mode='lines', name='X (gaze)'), secondary_y=False)
fig.add_trace(go.Scatter(x=t, y=y, mode='lines', name='Y (gaze)'), secondary_y=False)

# 定义离散色板(确保 e 的每个整数值有唯一颜色)
palette = px.colors.qualitative.D3  # 10色,足够覆盖 0-5
colors = [palette[int(val)] for val in e]  # 映射 e → 颜色

# 计算每个矩形的 x 边界:n 个点 → n+1 个分界点(中心对齐)
t_res = np.diff(t).mean() if len(t) > 1 else 1.0  # 时间分辨率(假设等距)
posts = np.append(t, t[-1] + t_res) - t_res / 2  # [t0-Δ/2, t1-Δ/2, ..., t_end+Δ/2]

# 逐段添加矩形(底部高度设为 y 轴范围的 5%)
y_max = max(np.max(x), np.max(y))
y_bottom = 0
y_top = 0.05 * y_max

for i in range(1, len(posts)):
    fig.add_shape(
        type="rect",
        x0=posts[i-1], x1=posts[i],
        y0=y_bottom, y1=y_top,
        line=dict(color="black", width=0.5),  # 细边框提升可读性
        fillcolor=colors[i-1],
        layer="below"  # 确保矩形在曲线之下
    )

# 可选:隐藏 y 轴次要刻度以简化底部区域
fig.update_yaxes(range=[-0.02*y_max, 1.05*y_max], secondary_y=False)
fig.update_layout(height=400, title="Eye Tracking: X/Y Trajectory with Event-Based Background")
fig.show()

⚠️ 注意事项:

  • 此方法生成 len(e) 个独立 shape,当 len(e) > 10⁴ 时可能影响渲染性能;
  • posts 构造必须保证相邻矩形无缝拼接(使用 t_res/2 偏移实现“中心采样”语义);
  • 若 t 非等距,请改用 np.interp() 或 pd.cut() 动态计算边界。

✅ 方案二:使用 go.Heatmap(高性能、原生支持离散映射)

更优雅且高效的方式是将事件序列 e 视为单行热力图(z = [e]),其 x 轴为 t,y 轴压缩为单层高度。Plotly 热力图天然支持离散色阶与自定义 colorbar:

# 在同一 fig 中添加热力图(替代手动矩形)
fig.add_trace(
    go.Heatmap(
        z=[e],                          # 1×N 矩阵
        x=t,                            # 时间轴
        y=[0, y_top],                   # y 范围:从 0 到矩形高度
        zmin=0, zmax=5,                 # 强制色阶覆盖全部事件值
        colorscale=[[i/5, palette[i]] for i in range(6)],  # 精确映射 0→5
        colorbar=dict(
            title="Gaze Event",
            tickvals=list(range(6)),
            ticktext=["Blink", "Fixation", "Saccade", "Pursuit", "Smooth", "Other"],
            len=0.4,
            yanchor="bottom", y=0.02
        ),
        showscale=True,
        hovertemplate="t=%{x:.1f}s<br>Event=%{z}<extra></extra>"
    ),
    secondary_y=False
)

# 关键:设置 yaxis 范围,使热力图紧贴横轴底部
fig.update_yaxes(range=[-0.02*y_max, 1.05*y_max], secondary_y=False)

✅ 优势总结:

  • 渲染性能优异,万级时间点仍流畅;
  • 自动处理坐标对齐与抗锯齿;
  • 内置 hovertemplate 与 colorbar 配置,交互体验更专业;
  • 支持 colorscale 精确绑定离散值(推荐用 [[v, color], ...] 格式)。

? 最终建议

  • 中小数据量( → 选用 add_shape 方案;
  • 大数据量、强调性能与可维护性 → 首选 Heatmap 方案;
  • 无论哪种方案,务必统一 t 的分辨率逻辑,并在 colorbar 或图例中明确定义 e 值语义(如 Fixation=1),这是科学可视化的基础规范。

通过以上任一方法,你都能在 Plotly 中构建出专业、准确、可解释的眼动事件-轨迹联合视图,为行为分析提供坚实可视化支撑。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

1851

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

5024

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1809

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

30237

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3607

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3607

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

1243

2023.08.11

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

616

2023.08.10

Tailwind CSS 如何制作导航栏和卡片
Tailwind CSS 如何制作导航栏和卡片

用 Tailwind CSS 制作导航栏和卡片,可先搭建语义化结构,再组合 Flex、Grid、间距、圆角与阴影类。这里整理横向导航、移动端菜单、卡片网格及悬停效果的相关文章,帮助你把常见页面组件做得清晰且适配不同屏幕。

0

2026.11.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn