跳到正文
册页

图表

ScatterChart - 散点图

两个度量互相对照,每个观测一个点。

用法

什么时候用它

相关性、聚类、离群点——这些问题一旦被塞进柱状图的桶里就答不出来了。这也是这里唯一一张横轴是数值而不是分类的图。

来自@misoto22/folio/charts

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

说明

两个度量互相对照,每个观测一个点——用来回答“这两者之间有没有关系”。

这是整套里唯一一张横轴是数值而不是分类的图,而这正是它的意义所在:散点回答的是相关性、聚类和离群点,这三个问题一旦被塞进柱状图的桶里就全没了。

超过三条序列,形状就分不开它们了,答案是小型多图——一条序列一张图、共用同一套坐标轴——而不是加第四种记号。

结构

ScatterChart anatomy
部件说明
图框必填ChartFigure 的那个 <figure>,带 isLoading 和一个空状态。是否为空是从显式声明的表格行里读出来的,理由和这张表格之所以要显式声明是同一个:观测挂在每个 <Scatter> 上,根节点看不到它们。
数值坐标轴必填<ScatterChart.XAxis> 和 <ScatterChart.YAxis>,默认都是 type="number"。这是本组唯一一张横轴是一个度量、而不是一个分类的图。
点云必填<ScatterChart.Scatter>,一条序列一团,每一团都带着自己的 data 数组,而不是去读根节点的。六种标记形状,而实心标记会加一圈 1px 的 --chart-surface 描边,这样两个落在同一位置的观测仍然数得清。
尺寸通道<ScatterChart.ZAxis>,range 默认是 [40, 400]。这个范围说的是面积、不是半径:半径翻倍会让墨量变成四倍,这就是气泡图通常说谎的方式。
十字光标tooltip 的光标,是两条线而不是一条带。一个散点由两个坐标确定位置,而单独一条竖直光标只回答了其中一半。
显式声明的表格在这里 table 是一个属性,不是推断出来的。散点的数据挂在每条序列上,所以根节点上没有可读的数据行——什么都不传,交付的就是一张完全没有表格的图。

实践建议

推荐

  • 要显式声明 table。这是本组唯一一张隐藏表格没法推导出来的图,所以漏掉它是静默失败:图渲染出来了,也有名字,背后却没有数字。
  • 区分序列,先靠形状。两级灰阶失效的地方,圆形对十字形仍然认得出来,而且形状在叠印和强制颜色下都成立——在强制颜色下,每一个 --series-* 令牌都会变成 CanvasText,一级明度差就没了。
  • 点云密集时,用 variant="outline" 或 shape="ring"。空心标记能露出它底下的东西;实心标记在两千个点的时候,画出来的只是最密处的一个剪影,别的什么都没有。

避免

  • 不要用序列之间 size 的差别去表达什么。size 是一个以像素计的固定半径,所以它什么都没编码,看上去却完全像在编码;把一个值映射到标记面积的路径只有 <ScatterChart.ZAxis> 一条。
  • 超过三条序列,形状就分不开它们了——圆形、十字和三角是分得清的,第四个图形是菱形,大多数读者看到的就是一个转过来的正方形。答案是共用坐标轴的小型多图,不是第四种标记。

示例

默认

两个度量互相对着放,一个观测一个标记——这是这里唯一一张 x 轴是数字、而不是分类的图表,正是这一点让它能回答相关性、聚集和离群点。七个点一起往上走是一个图形,不是一个系数:这里没有任何东西在拟合一条线,这张图也没有宣称 ms 里有多少份额是由 kB 解释的。每个实心标记都带着一圈表面色的环,那道细线让两个重叠的观测仍然数得清——超过几百个点它就不管用了,密度得换别的方式来展示。table 属性不是记账:散点图的数据行住在每一个 Scatter 上、而不是根节点上,所以和这个包里其他每一张图表不同,那张隐藏表格推断不出来,必须显式声明。

Load time against bundle size
Load time against bundle size
kbLoad (ms)
120340
180412
240505
310618
360660
420790
470812

形状与样式

两片互相重叠的点云,以及把它们分开的那些属性。这个包的灰阶是单色的,所以 shape 干的是别处由色相干的活:圆形对十字,把两片重叠的点云分开的效果,远好过两档灰,而且一个形状在叠印之下还活着,一档明度差则不然。outline 把标记挖空,而当点云互相压在一起时,就该去拿这个版本,因为一个空心标记能露出它底下的那个。超过三条序列,形状就不再能把它们分开,而答案是一张小倍数网格——一条序列一张图、同样的坐标轴——不是第四个字形。

Load time against bundle size
Load time against bundle size
kbLoad (ms)
120340
180412
240505
310618
420790
130520
190610
250704
320861
430990

气泡

同样两根轴上的第三个度量,由 ZAxis 承载。Recharts 是按面积单位来缩放 z 范围的,正是这一点让它安全:改成把值映射到半径,翻一倍墨水就变成四倍,于是一次下载量翻倍的发布,读起来会像受欢迎程度翻了四倍。这里 60 到 900 的范围,是十五倍的面积跨度,大约四倍的直径跨度。outline 也是刻意的——气泡在构造上就会重叠,而一个实心标记会把它压住的那个更小的气泡藏起来。

Load time, bundle size and downloads
Load time, bundle size and downloads
kbLoad (ms)Downloads
120340400
1804121,200
240505260
3106182,400
420790900

类型

TSX
export type ScatterShape = 'circle' | 'square' | 'triangle' | 'diamond' | 'cross' | 'ring'
export type ScatterVariant = 'solid' | 'outline' | 'gradient'

无障碍

  • title 必填。表格视图是显式声明的、不是推断出来的:散点的数据挂在每条序列上,根节点上并没有一份统一的数据行可读。
  • 在这里承担别处由色相承担的工作的是形状。两团重叠的点,用圆形对十字形去分远比用两级灰阶好认——而且形状在叠印时仍然成立,灰阶不行。
  • 实心点自带一圈页面色描边,所以两个落在同一位置的观测仍然数得清。
  • ZAxis 把它的度量映射到点的面积、不是半径:半径翻倍会让墨量变成四倍,这是气泡图最常见的说谎方式。