0

0

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

花韻仙語

花韻仙語

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

|

786人浏览过

|

来源于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()

⚠️ 注意事项

千问智学
千问智学

阿里旗下AI教育应用(原夸克学习APP)

下载
  • 此方法生成 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

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

3

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

12

2026.03.03

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

69

2026.02.28

Golang 工程化架构设计:可维护与可演进系统构建
Golang 工程化架构设计:可维护与可演进系统构建

Go语言工程化架构设计专注于构建高可维护性、可演进的企业级系统。本专题深入探讨Go项目的目录结构设计、模块划分、依赖管理等核心架构原则,涵盖微服务架构、领域驱动设计(DDD)在Go中的实践应用。通过实战案例解析接口抽象、错误处理、配置管理、日志监控等关键工程化技术,帮助开发者掌握构建稳定、可扩展Go应用的最佳实践方法。

59

2026.02.28

Golang 性能分析与运行时机制:构建高性能程序
Golang 性能分析与运行时机制:构建高性能程序

Go语言以其高效的并发模型和优异的性能表现广泛应用于高并发、高性能场景。其运行时机制包括 Goroutine 调度、内存管理、垃圾回收等方面,深入理解这些机制有助于编写更高效稳定的程序。本专题将系统讲解 Golang 的性能分析工具使用、常见性能瓶颈定位及优化策略,并结合实际案例剖析 Go 程序的运行时行为,帮助开发者掌握构建高性能应用的关键技能。

46

2026.02.28

Golang 并发编程模型与工程实践:从语言特性到系统性能
Golang 并发编程模型与工程实践:从语言特性到系统性能

本专题系统讲解 Golang 并发编程模型,从语言级特性出发,深入理解 goroutine、channel 与调度机制。结合工程实践,分析并发设计模式、性能瓶颈与资源控制策略,帮助将并发能力有效转化为稳定、可扩展的系统性能优势。

24

2026.02.27

Golang 高级特性与最佳实践:提升代码艺术
Golang 高级特性与最佳实践:提升代码艺术

本专题深入剖析 Golang 的高级特性与工程级最佳实践,涵盖并发模型、内存管理、接口设计与错误处理策略。通过真实场景与代码对比,引导从“可运行”走向“高质量”,帮助构建高性能、可扩展、易维护的优雅 Go 代码体系。

20

2026.02.27

Golang 测试与调试专题:确保代码可靠性
Golang 测试与调试专题:确保代码可靠性

本专题聚焦 Golang 的测试与调试体系,系统讲解单元测试、表驱动测试、基准测试与覆盖率分析方法,并深入剖析调试工具与常见问题定位思路。通过实践示例,引导建立可验证、可回归的工程习惯,从而持续提升代码可靠性与可维护性。

4

2026.02.27

漫蛙app官网链接入口
漫蛙app官网链接入口

漫蛙App官网提供多条稳定入口,包括 https://manwa.me、https

348

2026.02.27

热门下载

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

精品课程

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号