使用一些实际的自定义场景,去看 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
 
 - ✅ getCoordinate()
 - elements
- ✅ getGeometries()
 - ✅ getElements()
 - ✅ getElementsBy(condition)
 - ✅ getComponents()
 
 - analysis
- ✅ filter(field, condition) 筛选
 - ✅ changeData(data) 更新数据(下钻)
 - ❓ state() 设置数据状态(联动)(在 element 上)
 
 
 - data
 - 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
 
 
 - tooltip
 - events(每个组件都有自己的交互事件,可以 prevenDefault)
- tooltip
- valuechanged
 
 - legend
- selectchanged
 
 - slider
- valuechanged
 
 
 - tooltip
 
业务自定义场景
自定义 legend

实现方式是饼图使用 G2 绘制,但是图例使用 div/react 绘制。
const [data, setData] = useState([]);chart.on('afterrender', () => {const elements = chart.getElements();const data = elements.map(ele => ({type: ele.getModel().data.type,value: ele.getModel().data.value,color: ele.getModel().mapping.color,}));setData(data);});// render react component with data
指标卡图例,带 tooltip 功能
不 hover 的时候,指标卡显示最新值,hover 分组的时候,指标卡显示分组的指标值。指标卡 hover 的时候,高亮图表元素。
指标卡使用 react 实现,从图表中获取数据。
const [data, setData] = useState([]);chart.on('tooltip:onchange', ({ items }) => {// 可能需要做一些数据处理setData(data);});const onIndicatorMouseOver = (data) => {const elements = chart.getElementBy((ele) => isEqual(ele.getMolde().data, data));elements.forEach(ele => ele.setState('active'));}// 渲染render() {<IndicatorList data={data} onMouseOver={onIndicatorMouseOver}></IndicatorList>}
自定义标注

方法是在柱形图中间,用 div 绘制。那么难点就是如何获取 div 的决定定位 x y。也就是柱子的中间位置。
const [data, setData] = useState([]);const elements = chart.getElements();// 第一个空隙的 y 位置const y1 = elements[0].getBBox().bottom.y// 第一个空隙的高度const height1 = elements[1].getBBox().top.y - elements[0].getBBox().bottom.y;// 有了这些信息,绘制 div 位置的计算,就不难了。
联动其他图表
很多场景,比如:
- 饼图点击的时候,联动另外一个表格
 - hover 柱形图的一个柱子,高亮饼图的一个数据区块
 
todo
