Rainytoken/docs/heatmap-plan.md
WaterRain 962d8f1215
feat(heatmap): 年份选择器 + 每周视图柱状图 + 对抗审查修复
- 修复 4 个 heatmap 提交的编译错误与对抗审查问题:浮层锚定与跨年日期、
  Crossfade 快照、时区口径统一(useUtc8)、万级格式化溢出、周视图周日对齐
- 新增年份选择器:自然年语义、默认今年、三种视图跟随、下拉菜单、
  图例固定不随热力图滚动、打开默认滚到最右、0 token 天可点击查看
- 每周视图改为离散柱状图:列=自然周,高度按 token 排名比例映射 2~7 格
  (不同量级周高度可区分),0 用量周显示 Level 0 空白格(整列 7 格全绘制)
- 选中周整列主题色描边强调,浮层日期跨年带年份前缀
- 文档 docs/heatmap-plan.md 补充年份选择器/图例与滚动/柱状图章节
2026-08-06 22:33:25 +00:00

5.9 KiB
Raw Blame History

Token 活动热力图 — 设计方案

参考实现:reference/react-activity-calendar(grubersjoe/react-activity-calendar,MIT) 该库为 React/SVG Web 组件,本项目用 Jetpack Compose Canvas 重新实现,仅参考其布局逻辑和数据结构。


一、入口与数据源

  • 主页新增一个入口,点击进入独立的 Token 活动热力图页面
  • 只统计 OCGO 服务的数据,不涉及 CCGO / Codex / Ollama

二、页面布局

  • 标题左对齐:「Token 活动」
  • 标题右侧视图切换:每日 / 每周 / 累计
    • 选中项:主要文字颜色 + 中等字重
    • 未选中项:弱文字颜色
    • 不使用大号按钮背景或明显的 Tab 胶囊样式

三、每日视图(默认)

  • GitHub Contribution Calendar 结构:
    • 53 列 × 7 行
    • 每列代表一周,每行代表星期中的一天
    • 越靠右越接近当前日期
    • 按所选自然年显示:今年 = 1月1日 ~ 今天;往年 = 1月1日 ~ 12月31日(完整自然年,取代早期「最近滚动 365 天」窗口,详见「十一、年份选择器」)
  • 格子参数:
    • 尺寸 10~12dp
    • 间距 3dp
    • 圆角 3dp
  • 月份标签:12sp,底部显示
  • 不显示左侧星期标签

注:2026-08 起已改为**年份选择器(自然年)**取代固定滚动 365 天窗口,详见「十一、年份选择器」。

四、颜色等级

  • 6 级:Level 0(空白)+ Level 1~5(逐渐加深的粉色)
  • 使用项目现有配色(Color.kt 中的粉色系)
  • 映射方案:分位数法
    • 收集所有非零日 Token 数,排序,计算分位阈值
    • Level 0:token = 0(空白)
    • Level 1:0 ~ 25% 分位
    • Level 2:25% ~ 50% 分位
    • Level 3:50% ~ 75% 分位
    • Level 4:75% ~ 95% 分位
    • Level 5:95% 以上
    • 颜色会随数据变化是预期行为(与 GitHub 热力图一致)

五、每周视图

  • 与每日视图共用同一 7 行 × 约 53 列网格尺寸(列数按所选自然年浮动 52~54),切换视图时布局保持一致
  • 语义为离散柱状图:横轴 = 自然周,每一列 = 一周,纵向高度 = 该周 Token 用量
  • 每列从底部向上填充格子,用量越多填充越高;整列 7 格全部绘制:底部 barHeight 格 = 该周等级颜色(柱),其余格 = Level 0 浅色(空白格不隐藏,网格完整),最大高度 = 7 格满柱
  • 高度映射:非零周按 token 去重排序的排名比例映射 2~7 格(height = 2 + rankIndex×5/(uniqueCount-1),排名不同高度必不同,如 3.7亿 → 2 格、10.7亿 → 7 格;唯一非零值时满柱 7 格)
  • 填充格使用该周的等级颜色(6 级粉色分位,与图例"少→多"一致)
  • 列内格子不表示周日~周六(与每日视图的日期语义解耦)
  • 周列与日视图一致按周日对齐;第一列 = 该年 1月1日 所在周(可能含去年 12 月空位),最后一列 = 结束日所在周(今年 = 今天所在周,往年可能跨到次年 1 月初)
  • 点击:每周视图列内任意格子可点击查看该周浮层("X月X日-X月X日 使用了X token"),含 0 用量周(显示"使用了0token");选中周整列加主题色描边强调(再次点击或点击其他周取消)

六、累计视图

  • 和每日视图同样的小格子风格
  • 53 列 × 7 行
  • 每个格子的颜色代表从起始日到该日的累计 Token 总量
  • 同样用分位数法映射到 6 级

七、格子交互

  • 点击格子显示浮层,内容为日期和当天使用的 Token 数
  • 浮层格式示例:
    7月9日 使用了1.9亿token
    7月10日 使用了1124.5万token
    7月11日 使用了11.2万token
    7月12日 使用了16783token
    
    (Token 数按数量级自然中文读法显示)
  • 再次点击或点击外部关闭浮层
  • 不需要"查看详情"按钮
  • 热力格支持键盘聚焦,提供日期与 Token 数的无障碍描述

八、视图切换动画

  • 切换视图使用约 150ms 的淡入淡出
  • 不要明显的滑动或弹跳动画

九、Token 定义

  • 热力图中的「使用 token」= inputTokens + cacheReadTokens + reasoningTokens + outputTokens
    • inputTokens:未命中缓存的输入 token
    • cacheReadTokens:命中缓存的输入 token
    • reasoningTokens:推理 token(思维链 CoT)
    • outputTokens:输出 token
  • 不包含 cacheWrite5mTokens 和 cacheWrite1hTokens(缓存写入 token)

十、Token 数显示格式

  • 按数量级自然转换为中文读法:
    • 亿级:1.9亿
    • 千万级:1124.5万
    • 万级:11.2万
    • 万以下:原始数字(如 16783)

十一、年份选择器(2026-08 新增)

  • 标题「Token 活动」右侧为年份下拉选择器(「2026 ▾」),点击弹出年份列表
  • 语义:按自然年查看
    • 今年:1月1日 ~ 今天(默认选中年份)
    • 往年:1月1日 ~ 12月31日(完整自然年)
    • 取代原先固定「最近滚动 365 天」窗口
  • 可选年份范围:最早有数据的年份 ~ 今年
  • 三种视图(每日/每周/累计)均跟随所选年份,分位数按所选年份独立计算(颜色随年份数据变化是预期行为)
  • 周视图按自然年时列数浮动(52~54 列,闰年且 1月1日 为周六时可达 54 列):
    • 第一列为该年 1月1日 所在周(可能含去年 12 月空位)
    • 最后一列为结束日所在周(今年=今天所在周;往年可能跨到次年 1 月初)
  • 浮层日期:日期所在年份与今年不同时前缀加年份(如「2024年7月9日 使用了1.9亿token」)

十二、图例与滚动(2026-08 新增)

  • 底部「少 → 多」颜色图例固定显示,不随热力图横向滚动
  • 页面打开 / 切换视图 / 切换年份时,热力图横向滚动自动定位到最右(最新数据)
  • 0 token 的天可以点击查看浮层(显示「7月9日 使用了0token」);每周视图 0 用量周显示 1 格 Level 0 浅色格、同样可点击(柱状图语义,见「五、每周视图」)