@逍为(hustcc)

使用一些实际的自定义场景,去看 G2 需要提供哪些体系的 API。

G2 能力透出

View 和 Geometry 是两个核心的类,按照他们包含的内容进行提供 API(这里没有列举出使用 G2 构建图表的必备 API)

  • view
    • data
      • ✅ getOriginalData()
      • ✅ getData()
      • ✅ getOptions()
    • layout
      • ✅ getPadding()
      • ❓ getCoordinateSize()
    • scale
      • ✅ getScale(field)
    • coordinate
      • ✅ getCoordinate()
        • ✅ convert(x, y)
      • ✅ getWidth
      • ✅ getHeight
    • elements
      • ✅ getGeometries()
      • ✅ getElements()
      • ✅ getElementsBy(condition)
      • ✅ getComponents()
    • analysis
      • ✅ filter(field, condition) 筛选
      • ✅ changeData(data) 更新数据(下钻)
      • ❓ state() 设置数据状态(联动)(在 element 上)
  • geometry
    • ❓ getWidth() (用 coordinate 比较明确)
    • ❓ getHeight()
    • data
      • ✅ getData()
      • ❌ getOptions() (等 options 优化后提供)
      • ✅ getFields()
      • ✅ getGroupFields()
      • ✅ getXYFields()
      • ✅ getXField()
      • ✅ getYField()
    • elements
      • ✅ getElemets()
      • ✅ getElementsBy(condition)
    • adjust
      • ✅ getAdjust(type)
    • attribute
      • ✅ getAttribute(key)
      • ✅ getAttributeValues(attr, datum)
    • coordinate
      • ✅ getCoordinate()
  • ✅ element
    • ✅ getModel()
    • ✅ getBBox()
    • ✅ getData()
    • ✅ setState()
  • components
    • tooltip
      • show
      • hide
  • events(每个组件都有自己的交互事件,可以 prevenDefault)
    • tooltip
      • valuechanged
    • legend
      • selectchanged
    • slider
      • valuechanged

业务自定义场景

自定义 legend

image.png
实现方式是饼图使用 G2 绘制,但是图例使用 div/react 绘制。

  1. const [data, setData] = useState([]);
  2. chart.on('afterrender', () => {
  3. const elements = chart.getElements();
  4. const data = elements.map(ele => ({
  5. type: ele.getModel().data.type,
  6. value: ele.getModel().data.value,
  7. color: ele.getModel().mapping.color,
  8. }));
  9. setData(data);
  10. });
  11. // render react component with data

指标卡图例,带 tooltip 功能

不 hover 的时候,指标卡显示最新值,hover 分组的时候,指标卡显示分组的指标值。指标卡 hover 的时候,高亮图表元素。
image.png
指标卡使用 react 实现,从图表中获取数据。

  1. const [data, setData] = useState([]);
  2. chart.on('tooltip:onchange', ({ items }) => {
  3. // 可能需要做一些数据处理
  4. setData(data);
  5. });
  6. const onIndicatorMouseOver = (data) => {
  7. const elements = chart.getElementBy((ele) => isEqual(ele.getMolde().data, data));
  8. elements.forEach(ele => ele.setState('active'));
  9. }
  10. // 渲染
  11. render() {
  12. <IndicatorList data={data} onMouseOver={onIndicatorMouseOver}></IndicatorList>
  13. }

自定义标注

image.png
方法是在柱形图中间,用 div 绘制。那么难点就是如何获取 div 的决定定位 x y。也就是柱子的中间位置。

  1. const [data, setData] = useState([]);
  2. const elements = chart.getElements();
  3. // 第一个空隙的 y 位置
  4. const y1 = elements[0].getBBox().bottom.y
  5. // 第一个空隙的高度
  6. const height1 = elements[1].getBBox().top.y - elements[0].getBBox().bottom.y;
  7. // 有了这些信息,绘制 div 位置的计算,就不难了。

联动其他图表

很多场景,比如:

  • 饼图点击的时候,联动另外一个表格
  • hover 柱形图的一个柱子,高亮饼图的一个数据区块

todo