G2 整体架构:https://yuque.antfin-inc.com/antv/g2-4/nzfwgw#FQA0L
G2-core 架构 https://yuque.antfin-inc.com/eva-engine/specs/kg56om#T88N9

image.png

Core

  • 伪代码
  1. import { Canvas } from '@antv/g';
  2. import { View, Axis, Legend, Line, Coordinate, LAYER, POSITION } from '@antv/g2-core';
  3. // g 容器
  4. const canvas = new Canvas({ containerId: '#canvas' });
  5. // view
  6. const view = new View({
  7. width: 300,
  8. height: 300,
  9. container: canvas,
  10. });
  11. // line gemo
  12. const coordinate = new Coordinate.Rect({ start, end });
  13. const line = new Line({ data: [], coordinate });
  14. line.position('date*sale');
  15. line.color('city');
  16. // initial: data group, 0~1, initial attr, scale
  17. line.initial();
  18. // create Axes, legend with geometry's api
  19. const y = new LinarAxis({
  20. scale: line.getScale('sale'),
  21. title: {
  22. textStyle: {
  23. fontSize: 12, // 文本大小
  24. textAlign: 'center', // 文本对齐方式
  25. fill: '#999', // 文本颜色
  26. // ...
  27. }
  28. }
  29. });
  30. const x = new CatAxis({ scale: line.getScale('date') });
  31. const legend = new Legend({ items: line.getFieldDIM('city') });
  32. // add geometry, component into view
  33. // set Group Layer
  34. // set Layout Positon
  35. view.add(line);
  36. view.add(x, LAYER.FORE);
  37. view.add(y, LAYER.FORE);
  38. view.add(legend, LAYER.FORE, POSITION.BOTTOM);
  39. view.layout((components) => {
  40. // 针对 Component 的类型以及 Position,来逐个布局,计算:
  41. // 1. axis 的 width,height
  42. // 2. 每个组件的 x,y
  43. // 3. geom 的 coordinate 大小
  44. });
  45. // geom render, canvas render
  46. view.render();
  1. 组件完全自定义,g2-plot 代码组织更容易
  2. 布局完全自定义,布局放到 view 中

G2

  • 伪代码
  1. import { Chart } from '@antv/g2';
  2. const chart = new Chart({
  3. containerId: '#canvas',
  4. });
  5. // 设置数据
  6. view.data([]);
  7. // 折线图 Geometry
  8. view.line()
  9. .positon('date*sale')
  10. .color('city');
  11. // x axis 配置
  12. view.axis('date', {
  13. title: {
  14. textStyle: {
  15. fontSize: 12, // 文本大小
  16. textAlign: 'center', // 文本对齐方式
  17. fill: '#999', // 文本颜色
  18. // ...
  19. }
  20. }
  21. });
  22. // y axis 配置
  23. chart.axis('sale', { ... });
  24. chart.legend({
  25. position: 'bottom',
  26. itemGap: 20
  27. });
  28. // 内置一套 Component Layout 逻辑,如果觉得处理的不好,可以针对性的去增加 layout 逻辑
  29. chart.render();

整体来说,是通过 API 提供的这些配置,都最终转换成 core 中的 API 来组织。

  • 内置几套 Component 组件
  • 内置一个 Layout 函数

自定义组件

  • core 中的自定义组件完全没有问题
  • g2 中的自定义组件有些麻烦,配合着需要增加其 API,比如增加 Title 组件,需要增加 chart.title API。
  • 自定义组件一定伴随着自定义布局

组件布局

一个机制,可以对 view 中的组件调整 x、y、width、height。(width、height 只有 Axis 会用到),并且需要让开发者可以在 G2 内置布局的基础上,进行调整。

可以利用大概的洋葱模型的方式,可以设置一系列布局函数,可以使用默认的函数,也可以在默认函数之后、之前加入自己的函数进行局部调整。

  1. +----------------------------------------------------------------------------------+
  2. | |
  3. | layout 1 |
  4. | |
  5. | +-----------------------------------------------------------+ |
  6. | | | |
  7. | | layout 2 | |
  8. | | | |
  9. | | +---------------------------------+ | |
  10. | | | | | |
  11. | action | action | layout 3 | action | action |
  12. | 001 | 002 | | 005 | 006 |
  13. | | | action action | | |
  14. | | | 003 004 | | |
  15. | | | | | |
  16. +---------------------------------------------------------------------------------------------------->
  17. | | | | | |
  18. | | | | | |
  19. | | +---------------------------------+ | |
  20. | +-----------------------------------------------------------+ |
  21. +----------------------------------------------------------------------------------+

自定义布局就是在洋葱圈中增加一圈,当然也可以将之前的圈给去掉。

嵌套 view

TODO

其他

其他的点都不会变化。

  • 数据处理流程
  • 数据更新
  • 事件
  • 动画
  • Element & 自定义 shape