跳到正文
册页

图表

RadialChart - 径向图

弧上的值——一个仪表,或几个共用一把刻度的总量。

用法

什么时候用它

单个值对照一个固定总量。超过大约四根柱子就该老实用 BarChart,因为径向柱的半径并不代表它的值。

来自@misoto22/folio/charts

TSX
import { RadialChart } from '@misoto22/folio/charts'

说明

弧上的值——一个仪表,或者几个共用一把刻度的总量。

动手前值得知道的一点:径向柱的长度是它的值,但半径不是,所以内圈和外圈上同样的值会被画成不同长度。这让它不适合做比较、适合做单值仪表;超过大约四根柱子,老实用 <BarChart>。

结构

RadialChart anatomy
部件说明
图框必填ChartFigure 的那个 <figure>,零行数据时带一个空状态。它的隐藏表格需要一个值字段,来源是 valueKey,或者退一步,取自组合进来的 <RadialChart.RadialBar> 的 dataKey——所以两个都没写的图,仍然没有表格。
弧必填<RadialChart.RadialBar>,一行一段,14px 粗、5px 的端头圆角。variant="semi" 会把圆心降到 70%,让半圈弧坐在自己盒子的中间、而不是顶上。
轨道showTrack,默认打开,用 --chart-track 在每段弧后面画出未填充的剩余部分。仪表之所以是仪表,靠的就是它:没有它,那段填充就没有一个看得见的整体可以归属。
刻度设了 max 时根节点插入的那根 PolarAngleAxis,取值域是 [0, max],刻度线关闭。不设 max,取值域就改从数据里推出来。
图例<RadialChart.Legend>。弧没有分类轴,所以超过一根柱子时,能给它们命名的只有它。

实践建议

推荐

  • 凡是仪表就要设 max。不设,刻度就从数据推出来,于是最大的那根柱子永远填满整段弧,62% 和 98% 会被画成一模一样。
  • 弧不是唯一的标记时,要传 valueKey。它指明隐藏表格印的是哪个字段,也指明图例按哪个字段报告选中项;它和组合进来的 <RadialChart.RadialBar> 一个都没有,就没有值字段,表格也不是空的,而是根本不存在。
  • 单个值用 variant="semi"。半圈弧读起来像一个有下限也有上限的表盘,而整圈环则要读者自己去想明白一整个圆值多少。

避免

  • 不要跨半径去比较柱子。径向柱的长度才是它的值,半径不是,所以装着同一个数字的内圈弧和外圈弧,画出来的长度并不一样——超过大约四根柱子,BarChart 才是老实的形式。
  • max 没设时,不要让读者把一段弧当成整圈的占比。那时候,扫满一整圈说的是“这里最大的那个”,和“全部”是两句不同的话。

示例

默认

三个合计画在一段弧上,没有 max,所以刻度来自数据,最大的那根条永远填满整个环。要当心的地方是几何性的:一根条的长度是它的值,但它的半径不是,所以内圈一根条和外圈一根条握着同一个数字,画出来的长度不一样,而这个环偏袒的永远是待在最外圈的那个。这让它成为一个给三四个「读者只会瞟一眼」的值用的展示,而任何要排名次的东西,诚实的选择是 BarChart。命名的活由图例来干,因为这些弧自己不带坐标轴。

Storage used by tier
Storage used by tier
tierValue
documents72
photos54
backups31

仪表盘

一个值对着一个固定的总量——这是径向图毫无争议地正确的那个场景。max 才是让它成为仪表的东西:没有它,刻度来自数据,孤零零那根条永远填满整段弧,于是 62 和 98 会被画得一模一样。条形背后那条轨道是这次读数的另一半,因为它正是这个值所占其中一份的那个余量。semi 把圆心降到盒子的 70% 处,好让这个半圆坐在自己那块空间的中间,而不是顶部。

Storage used
Storage used
tierValue
used62

加载中

骨架。isLoading 把这些弧换成五段它们自己的弧,每 1.5 秒重掷一次并在长度之间变形,同时保住这个图形量出来的高度,所以数据落下来时页面不跳;在 prefers-reduced-motion 下它们改为停着不动。那些长度来自一个确定性函数、而不是 Math.random,所以服务端和客户端画出同一份骨架,水合也就没有什么可以对不上的。组合进来的 RadialBar 在这个状态下什么都不画——它在这儿,是为了让数据行到达之后,这张图能以本来面目、带着同一根条回来。

Storage used by tier
Loading

类型

TSX
export type RadialVariant = 'full' | 'semi'

无障碍

  • title 必填;传入 valueKey,数据行同样会渲染成一份视觉隐藏的表格。
  • 要设置 max,否则刻度会从数据推出来、最大的那根永远填满整段弧——这会让 62% 和 98% 看起来一模一样。
  • showTrack 画出未填充的剩余部分,仪表全靠它才读得懂。