SuperAPI AI 工具集

dont-slice-one-circle-between-unrelated-measures

数据与分析

查看项目

更新于 10-17 16:16

技能介绍

本条目是一条面向 Kotlin 与 Canvas 绘图的数据可视化规则,主题是“同心圆弧,而不是把圆切成几份”。资料给出的场景是三个计数:不同条目、不同分组、不同实体。这三个数测量的是同一时间窗口内三种不同的量,并不相加成一个总量;如果改用饼图或环形图把它们分到一个圆里,就等于把每一个数画成了一个并不存在的总量的份额。同心环把三者放在同一套角度刻度上,各自以三者中的最大值为基准,不暗示它们之间存在部分与整体的关系。

主要能力

  • 同心环绘制:示例代码按最外层在前的顺序遍历数据行,以 rows.maxOf { it.value } 作为分母,每圈用 drawArc 绘制 360° 的深色底环,再用不同的颜色绘制数值弧线。
  • 截短最大扫角:最大的那一圈扫角乘以 0.92,留出 28.8° 的空隙,避免起点和终点重合,导致编码数值的端点消失。
  • 底环衬托:数值弧线叠加在完整的底环上,让“几乎为空”的时段仍能被读者识别为一个槽位,而不是缺失的刻度。
  • 底环与数值弧线共用同一函数和同一组角度:在 24 个扇区的时钟式图中,两者只在外半径上不同,从而避免一像素级的错位。
  • 间隙放入角度而非形状之间:每个扇区取 sweep = slice − gap,起点偏移 gap / 2,使分隔在各个半径上保持均匀。
  • 图例的稳健性:图例颜色应在色相上有所区别,并在灰度下仍可区分;同时借助半径顺序、外、中、内标注或引导线等非颜色线索。

使用时需注意的陷阱

  • 圆形分割本身就会先于任何标签传达“这些是同一整体的部分”的含义,标注无法撤销这一印象。只有当各部分确实构成一个可以用一个词命名的整体时,才使用饼图。
  • 整圈与接近整圈在视觉上无法区分,因此必须截短最大扫角。
  • StrokeCap.Round 会向两端各延伸半个线宽,折算成角度为 (stroke / 2) / radius,半径越小影响越大。按示例参数计算,三圈分别外溢约 10.6°、15.0°、25.1°,会把预留的空隙吃掉。应对方式包括:让最大的行落在最大的半径上,按各圈半径单独计算笔帽,或者改用平头笔帽。
  • radius <= 0 的守卫会静默丢弃某一行。按示例参数,前三圈半径约 0.4575d、0.3257d、0.1940d,第四圈已小到接近一团;第五圈为负值,被守卫丢弃,因此增加一个度量并非没有代价。
  • 如果只画很短的数值弧线,很容易被读成缺失的刻度,因此对完整的底环是必要的。
  • 图例只靠彩色圆点不够可靠:在打印、灰度或色盲条件下可能坍缩为同一种灰色。
  • 图表只能覆盖部分输入时,应在图上明确说明。

自查方式

资料给出只读的仓库根目录命令:用 grep 检索所有 drawArc 调用,关注数值弧线上的字面量 360f;用 awk 按自己的 stroke 与 step 重新推导半径序列与圆头笔帽外溢角度。示例参数会输出 10.6、15.0、25.1、78.2 度,随后第五圈被丢弃。手工验证方法是:给图表喂一组最内层持有最大值的数据,如果该圈看起来闭合,就说明笔帽占掉了预留空隙,需要按圈单独计算。

适用场景与限制

适用于在 Kotlin 中使用 Canvas 绘制多度量对比图、时钟式扇区图,以及任何需要在同一角度刻度上比较不同量纲数值的可视化。资料未提供该规则作为独立工具或库的安装方式、运行环境要求、收费模式与平台支持信息,内容为代码层面的实践规则与示例。