自定义 Label

简介

Label 文本标签是对当前的一组数据进行的内容标注,针对不同的图表对应不同的 label 类型,虽然 G2 默认的 label 文本类型可以满足大部分的场景需求,但是总有一些特殊需求无法满足,所以 G2 提供了自定义 Label 以及自定义 Label 布局函数的扩展机制。

自定义 Label

  1. import { registerGeometryLabel, GeometryLabel } from '@antv/g2';
  2. // Step 1
  3. // 自定义 Label 类
  4. // 需要继承 GeometryLabel 基类
  5. class CustomLabel extends GeometryLabel {}
  6. // Step 2
  7. // 注册 CustomLabel
  8. registerGeometryLabel('custom', CustomLabel);
  9. // Step 3
  10. // 使用
  11. chart
  12. .line()
  13. .position('x*y')
  14. .label('y', {
  15. type: 'custom',
  16. });

自定义 Label 需要继承 GeometryLabel 基类,通过覆写相应的方法来定义 label 的渲染配置,关于 GeometryLabel 类的详细介绍请阅读 API 文档

自定义 Label 布局函数

对于文本布局,有多种解决方案,为了更大的灵活,G2 提供了自定义 label 布局的机制,用户可以根据需求自定义 label 布局。

  1. import { registerGeometryLabelLayout } from '@antv/g2';
  2. // Step 1: 定义 label 布局函数
  3. function limitInShape(
  4. labels: IGroup[],
  5. shapes: IShape[] | IGroup[],
  6. region: BBox,
  7. ) {
  8. each(labels, (label, index) => {
  9. const labelBBox = label.getCanvasBBox(); // 文本有可能发生旋转
  10. const shapeBBox = shapes[index].getBBox();
  11. if (
  12. labelBBox.minX < shapeBBox.minX ||
  13. labelBBox.minY < shapeBBox.minY ||
  14. labelBBox.maxX > shapeBBox.maxX ||
  15. labelBBox.maxY > shapeBBox.maxY
  16. ) {
  17. label.remove(true); // 超出则不展示
  18. }
  19. });
  20. }
  21. // Step 2: 注册 label 布局函数
  22. registerGeometryLabelLayout('limit-in-shape', limitInShape);
  23. // Step 3: 使用
  24. chart
  25. .interval()
  26. .adjust('stack')
  27. .position('value')
  28. .color('type')
  29. .shape('slice-shape')
  30. .label('type', {
  31. layout: { type: 'limit-in-shape', }, });

关于 registerGeometryLabelLayout(type: string, layoutFn: GeometryLabelsLayoutFn) 接口的详细使用,请阅读 API 文档