大概涉及到的几个技术栈中,Ant Design Charts
是对 G2Plot
做了 React 化,G2Plot
是对 G2
做了API上的优化,G2
是对 G
做了图表的封装,而最底层的 G
是一套同时支持 Canvas 和 SVG 的 2D 渲染引擎。后三者都是 AntV
团队的作品,已开源,文档地址统一贴在文末。
G
G
的实现原理就是在画布 Canvas
上增加图形 Shape
,仿佛作画一般。
如下的代码画一块 600 * 500 的画布:
1 | // 这里的 Canvas 只是画布的意思,如果是 svg,则是 import { Canvas } from '@antv/g-svg'; |
如下的代码在这块画布上画一个圆:
1 | canvas.addShape('circle', { |
结果如图所示:
类型除了圆形circle
,还支持椭圆ellipse
、矩形rect
(包括圆角)、直线line
、折线polyline
、多边形polygon
、路径path
,以及几何图形、图片、文本、DOM 节点等。
除了单独画图形 Shape
,还支持增加分组 Group
,如下:
1 | const group = canvas.addGroup(); |
这样的好处是可以实现事件冒泡和委托,如下:
1 | // 事件冒泡 |
源码
G
是一个用 lerna
搭建的仓库,底下包括 g-base
、g-canva
、g-svg
、g-math
、g-mobile
、g-webgl
几个仓库。
g-base
包含了抽象画布 AbstractCanvas
之类的基类定义,以及在 g-base/lib/types
保存了相关 ts 定义。
g-canva
、g-svg
则是两套分别基于 canvas 和 svg 的具体实现,两者在 draw
方法的实现上有差异。
g-math
提供几何图形的运算。
g-mobile
、g-webgl
暂时还无内容。
G2
G2
是相对比较完善的图表库了,也是 AntV 团队 Star 数最高(10.3k)的作品了。
他是通过容器和数据源,配合图形语法,绘制出图表的。如下是创建 Chart
对象:
1 | import { Chart } from '@antv/g2'; |
可以见到和 G
创建画布如出一辙。如下是载入数据源:
1 | const data = [ |
接下来便是用 G2
的图形语法绘制图表。如下是绘制柱状图的一个例子:
1 | chart.interval().position('genre*sold'); |
结果如图所示:
源码
G2
的容器就是 G
的画布,会根据 renderer
调用 getEngine
获取不同的引擎(canvas/svg)。
G2Plot
G2Plot
就是在 G2
封装的基础上做了写法的优化。
Ant Design Charts
Ant Design Charts
对我而言就是就是封装了一层自定义组件,让我可以不必再手动写 useEffect
等逻辑去手动更新 G2Plot
的 config
或 data
。额外地,他还支持以下几个新功能:
- Tooltip 支持 ReactNode
- 额外的
downloadImage()
、toDataURL()
等 API - 自定义 memoData 功能,按需控制图表 rerender
参考资料
未完待续