G2除了支持函数调用方式外,也支持图形语法的配置项式声明方式。
为 Chart 对象新增 options 属性,用于支持配置项式声明。
const chart = new G2.Chart({width: 1000,height: 500,data: data,padding: [ 20, 80, 60, 80 ]options: {// 在这里声明所有的配置属性}});chart.render();
可以先通过以下几个例子来了解下:
实例 1:柱状图
const data = [{ genre: 'Sports', sold: 275 },{ genre: 'Strategy', sold: 115 },{ genre: 'Action', sold: 120 },{ genre: 'Shooter', sold: 350 },{ genre: 'Other', sold: 150 }];const chart = new G2.Chart({container: 'c1',forceFit: true,height: 300,data,options: {scales: {'genre': {alias: '游戏种类'},'sold': {alias: '销售量'}},geoms: [{type: 'interval',position: 'genre*sold',color: 'genre'}]}});chart.render();
对应函数式调用代码如下:
const chart = new G2.Chart({container: 'c1',height : 300,forceFit: true,});chart.source(data, {genre: {alias: '游戏种类'},sold: {alias: '销售量'}});chart.interval().position('genre*sold').color('genre')chart.render();
实例 2: 散点图
const { DataView } = DataSet;$.getJSON('/assets/data/diamond.json', (data) => {const dv = (new DataView()).source(data);const caratAvg = dv.mean('carat'); // 计算克拉数均值const priceAvg = dv.mean('price'); // 计算价格均值const chart = new G2.Chart({container: 'c2',forceFit: true,height: 450,data,options: {guides: [{type: 'line',start: [ caratAvg, 0 ], // 使用数组格式end: [ caratAvg, 20000 ],text: {position: 'end',autoRotate: false,content: '克拉数均值:' + caratAvg}},{type: 'line',start: {carat: 0,price: priceAvg}, // 使用对象格式end: {carat: 4,price: priceAvg},text: {position: 'end',autoRotate: false,content: '价格均值:' + priceAvg,style: {textAlign: 'end'}}},],geoms: [{type: 'point',position: 'carat*price',shape: 'circle',opacity: 0.3}]}});chart.render();});
对应函数式调用代码如下:
const chart = new G2.Chart({ // 创建图表container : 'c2',forceFit: true,height: 450});chart.source(data); // 设置数据源chart.point().position('carat*price').shape('circle').opacity(0.3);chart.guide().line({start: [ caratAvg, 0 ], // 使用数组格式end: [ caratAvg, 20000 ],text: {position: 'end',autoRotate: false,content: '克拉数均值:' + caratAvg}});chart.guide().line({start: {carat: 0,price: priceAvg}, // 使用对象格式end: {carat: 4,price: priceAvg},text: {position: 'end',autoRotate: false,content: '价格均值:' + priceAvg,style: {textAlign: 'end'}}});chart.render(); // 图表渲染
实例 3:多 views
$.getJSON('/assets/data/world.geo.json', (mapData) => {const chart = new G2.Chart({container: 'c3',forceFit: true,height: 450,padding: [ 55, 20 ],options: {tooltip: {showTitle: false},scales: {longitude: {sync: true},latitude: {sync: true}},axes: false,legends: {'trend': {position: 'left'}}}});// 绘制世界地图背景const ds = new DataSet();const worldMap = ds.createView('back').source(mapData, {type: 'GeoJSON'});const view = chart.view({data: worldMap,options: {tooltip: false,geoms: [{type: 'polygon',position: 'longitude*latitude',style: {fill: '#fff',stroke: '#ccc',lineWidth: 1}}]}});// 绘制展示数据// 可视化用户数据const userData = [{ name: 'Russia', value: 86.8 },{ name: 'China', value: 106.3 },{ name: 'Japan', value: 94.7 },{ name: 'Mongolia', value: 98 },{ name: 'Canada', value: 98.4 },{ name: 'United Kingdom', value: 97.2 },{ name: 'United States of America', value: 98.3 },{ name: 'Brazil', value: 96.7 },{ name: 'Argentina', value: 95.8 },{ name: 'Algeria', value: 101.3 },{ name: 'France', value: 94.8 },{ name: 'Germany', value: 96.6 },{ name: 'Ukraine', value: 86.3 },{ name: 'Egypt', value: 102.1 },{ name: 'South Africa', value: 101.3 },{ name: 'India', value: 107.6 },{ name: 'Australia', value: 99.9 },{ name: 'Saudi Arabia', value: 130.1 },{ name: 'Afghanistan', value: 106.5 },{ name: 'Kazakhstan', value: 93.4 },{ name: 'Indonesia', value: 101.4 }];const userDv = ds.createView().source(userData).transform({geoDataView: worldMap,field: 'name',type: 'geo.region',as: [ 'longitude', 'latitude' ]}).transform({type: 'map',callback: (obj) => {obj.trend = (obj.value > 100) ? '男性更多' : '女性更多';return obj;}});const userView = chart.view({data: userDv,options: {scales: {'trend': {alias: '每100位女性对应的男性数量'}},geoms: [{type: 'polygon',position: 'longitude*latitude',color: {field: 'trend',colors: [ '#C45A5A', '#14647D' ]},opacity: 'value',tooltip: 'name*trend',animate: {leave: {animation: 'fadeOut'}}}]}});chart.render();});
对应的函数式调用代码如下:
const chart = new G2.Chart({container: 'c3',forceFit: true,height: 450,padding: [ 55, 20 ]});chart.tooltip({showTitle: false});// 同步度量chart.scale({longitude: {sync: true},latitude: {sync: true}});chart.axis(false);chart.legend('trend', {position: 'left'});// 绘制世界地图背景const ds = new DataSet();const worldMap = ds.createView('back').source(mapData, {type: 'GeoJSON'});const worldMapView = chart.view();worldMapView.source(worldMap);worldMapView.tooltip(false);worldMapView.polygon().position('longitude*latitude').style({fill: '#fff',stroke: '#ccc',lineWidth: 1});// 可视化用户数据const userData = [{ name: 'Russia', value: 86.8 },{ name: 'China', value: 106.3 },{ name: 'Japan', value: 94.7 },{ name: 'Mongolia', value: 98 },{ name: 'Canada', value: 98.4 },{ name: 'United Kingdom', value: 97.2 },{ name: 'United States of America', value: 98.3 },{ name: 'Brazil', value: 96.7 },{ name: 'Argentina', value: 95.8 },{ name: 'Algeria', value: 101.3 },{ name: 'France', value: 94.8 },{ name: 'Germany', value: 96.6 },{ name: 'Ukraine', value: 86.3 },{ name: 'Egypt', value: 102.1 },{ name: 'South Africa', value: 101.3 },{ name: 'India', value: 107.6 },{ name: 'Australia', value: 99.9 },{ name: 'Saudi Arabia', value: 130.1 },{ name: 'Afghanistan', value: 106.5 },{ name: 'Kazakhstan', value: 93.4 },{ name: 'Indonesia', value: 101.4}];const userDv = ds.createView().source(userData).transform({geoDataView: worldMap,field: 'name',type: 'geo.region',as: [ 'longitude', 'latitude' ]}).transform({type: 'map',callback: (obj) => {obj.trend = (obj.value > 100) ? '男性更多' : '女性更多';return obj;}});const userView = chart.view();userView.source(userDv, {'trend': {alias: '每100位女性对应的男性数量'}});userView.polygon().position('longitude*latitude').color('trend', [ '#C45A5A', '#14647D' ]).opacity('value').tooltip('name*trend').animate({leave: {animation: 'fadeOut'}});chart.render();
配置项属性
const options = {scales: {object}, // 列定义声明coord: {object}, // 坐标系配置axes: {object}, // 坐标轴配置legends: {object}, // 图例配置guides: {array}, // 图表辅助元素配置filters: {object}, // 数据过滤配置tooltip: {object}, // 提示信息配置facet: {object}, // 分面配置geoms: {array} // 图形语法相关配置}
scales
类型: object
用于定义所有的列定义。使用方式同 chart.scale()。
具体使用方式如下
scales: {field1: {object}, // 为数据字段 field1 进行列定义field2: {object}, // 为数据字段 field2 进行列定义...}
具体列定义的参数 API: Scale。
示例
chart.scale({x: {type: 'cat',tickCount: 10},y: {type: 'linear',nica: false}});// 上述函数调用对应如下配置项声明scales: {x: {type: 'cat',tickCount: 10},y: {type: 'linear',nica: false}}
coord
类型: object
坐标系配置,函数式调用 api: chart.coord(type, cfg)。
具体配置方式如下:
coord: {type: {string}, // 坐标系类型声明,可取值: rect polar theta map helix gauge clockcfg: {object}, // 对应各个 type 坐标系属性配置,同 `chart.coord(type, cfg)` 中的 cfgactions: {array} // 声明坐标系需要进行的变换操作}
actions 属性的声明方式如下:
actions: [[ 'transpose' ],[ 'rotate', 90 ],[ 'scale', 1, -1 ],[ 'reflect', 'x' ]]
示例
chart.coord('polar', {innerRadius: 0.3,startAngle: - Math.PI / 2,endAngle: 3 * Math.PI / 2}).transpose();// 上述函数式调用对应如下配置coord: {type: 'polar',cfg: {innerRadius: 0.3,startAngle: - Math.PI / 2,endAngle: 3 * Math.PI / 2},actions: [[ 'transpose' ]]}
axes
类型:object
图表坐标轴配置,对应 chart.axis(dim, cfg) 方法。
具体使用方式:
- 不展示坐标轴
 
axes: false
- 不展示某条坐标轴
 
axes: {field: false, // 不展示数据字段 field1 对应的坐标轴}
- 为各个的坐标轴进行配置
 
axes: {field1: {object},field2: {object}// ...}
具体的配置属性同 chart.axis(field, cfg)。
示例
chart.axis('x', false);chart.axis('y', {tickLine: {length: 5,lineWidth: 2},label: {formatter: val => {return val + '$';},textStyle: {fontSize: 12}}});// 上述函数式调用对应如下配置axes: {x: false,y: {tickLine: {length: 5,lineWidth: 2},label: {formatter: val => {return val + '$';},textStyle: {fontSize: 12}}}}
legends
类型: object
图表图例配置,对应 chart.legend()。
- 不显示所有的图例
 
legends: false
- 为默认的图例进行配置
 
legends: {position: 'right', // 图例的显示位置,有 'top','left','right','bottom'四种位置,默认是'right'// ... 其他属性同 chart.legend()}
- 为各个数据字段对应的图例进行配置
 
legends: {field1: {object},field2: false // 不展示 field2 对应的图例}
示例
chart.legend('x', false);chart.legend('y', {position: 'top'});// 上述函数式调用对应如下配置legends: {x: false,y: {position: 'top'}}
guides
类型:array
图表辅助元素定义,对应 chart.guide()。
[{type: 'line', // 声明辅助元素的类型start: {array}, // 辅助线起始点,[startX, startY]end: {array}, // 辅助线结束点,[endX, endY]style: {stroke: '#999', // 线的颜色lineDash: [ 0, 2, 2 ], // 虚线的设置lineWidth: 3 // 线的宽度} // {object} 配置项,与原语法相同}]
示例
chart.guide().line({start: [ caratAvg, 0 ], // 使用数组格式end: [ caratAvg, 20000 ],text: {position: 'end',autoRotate: false,content: '克拉数均值:' + caratAvg}});// 上述函数式调用对应如下配置guides: [{type: 'line',start: [ caratAvg, 0 ], // 使用数组格式end: [ caratAvg, 20000 ],text: {position: 'end',autoRotate: false,content: '克拉数均值:' + caratAvg}}]
filters
类型:object
数据过滤,对应 chart.filter(dim, callback)。
filters: {${field1}: {function}, // 对字段名为 field1 的数据进行过滤${field2}: {function}, // 对字段名为 field2 的数据进行过滤...}
示例
chart.filter('x', val => {return val > 20;});// 上述函数式调用对应如下配置filters: {x: val => {return val > 20;}}
tooltip
类型:object
对应 chart.tooltip()
示例
chart.tooltip(false);chart.tooltip({showTitle: false});// 上述函数式调用分别对应如下配置tooltip: false,tooltip: {showTitle: false}
geoms
类型:array
用于声明绘制图表的图形语法,可同时声明多种 geom 配置。对应函数式调用 api: Geom。
geoms: [{type: {string}, // 声明 geom 的类型:point line path area interval polygon schema edge heatmap pointStack pointJitter pointDodge intervalStack intervalDodge intervalSymmetric areaStack schemaDodgeadjust: {string} | {array}, // 数据调整方式声明,如果只有一种调整方式,可以直接声明字符串,如果有多种混合方式,则以数组格式传入position: {string} | {object}, // potision 图形属性配置color: {string} | {object}, // color 图形属性配置shape: {string} | {object}, // shape 图形属性配置size: {string} | {object}, // size 图形属性配置opacity: {string} | {object}, // opacity 图形属性配置label: {string} | {object}, // 图形上文本标记的配置tooltip: {string}, // 配置 tooltip 上显示的字段名称style: {object}, // 图形的样式属性配置active: {boolean}, // 开启关闭 geom active 交互select: {object}, // geom 选中交互配置animate: {object} // 动画配置},{// 同上述配置相同,可以定义多个 geom}]
positon
用于声明映射至位置 position 属性的数据字段,使用方式很简单:
position: 'field1*field2'
或者
position: {field: 'field1*field2'}
color
chart.geom().color(value)对应:
color: value, // value 可以是数据字段名、颜色值
或者
color: {field: value, // value 可以是数据字段名、颜色值}
chart.geom().color(field, colors)对应:
color: {field: {string}, // 声明映射至 color 属性的数据字段名colors: {array | string } // string | array,可声明颜色、渐变颜色等}
- 回调函数声明 
chart.geom().color(field, colorCallback)对应: 
color: {field: {string}, // 声明映射至 color 属性的数据字段名callback: {function} // 用户自定义回调函数}
shape
chart.geom().shape(value)对应:
shape: value, // value 可以是数据字段名、图形形状名
或者
shape: {field: value, // value 可以是数据字段名、图形形状名}
chart.geom().shape(field, shapes)对应:
shape: {field: {string}, // 声明映射至 shape 属性的数据字段名shapes: {string | array} // string | array}
- 回调函数声明 
chart.geom().shape(field, callback)对应: 
shape: {field: {string}, // 声明映射至 shape 属性的数据字段名callback: {function} // 用户自定义回调函数}
size
chart.geom().size(value)对应
size: value // value 可以是数据字段名、数值
或者
size: {field: value, // value 可以是数据字段名、图形形状名}
chart.geom().size(field, [ min, max ])对应:
size: {field: {string}, // 声明映射至 size 属性的数据字段名range: [min, max ] // 声明 size 的最大和最小值}
chart.geom().size(field, callback)对应:
size: {field: {string}, // 声明映射至 size 属性的数据字段名callback: {function}}
opacity
chart.geom().opacity(field)对应:
opacity: field, // field 对应映射至 opacity 的数据字段名、具体透明度数值
或者
opacity: {field: field // field 对应映射至 opacity 的数据字段名、具体透明度数值}
chart.geom().opacity(field, callback)对应
opacity: {field: {string}, // 声明映射至 opacity 属性的数据字段名callback: {function}}
label
chart.geom().label(field)对应
label: field, // field 对应字段名或者带有统计的声明
chart.geom().label(field, cfg)对应
label: {field: {string}, // 需要标注的数据字段名cfg: {object} // 具体的 label 配置,参见 geom.label() 方法}
- 如果 label 中需要声明回调函数,声明 callback 属性即可:
 
label: {field: {string}, // 需要标注的数据字段名cfg: {object}, // 具体的 label 配置callback: {function}}
tooltip
// 对应 geom.tooltip('x')tooltip: {string} // 直接声明需要显示在 tooltip 上的字段名// 对应 geom.tooltip('x', function(val){})tooltip: {field: {string},callback: {function}}
style
// 使用方式一style: {field: {string}, // 映射的字段cfg: {object} // 配置信息};// 使用方式二style: {lineWidth: 1 // 样式的配置信息}
select
select: {boolean} // 开启关闭选中功能
select: {mode: 'multiple' | 'single', // multiple 为多选,single 为单选, false 为关闭选中功能style: {// 设置选中图形的样式,不设置则使用默认提供的样式// 图形绘制属性,如 fill stroke}}
active
active: false | true
animate
animate: {// 同 geom.animate()}
View 视图的配置项声明
视图的配置项同 chart 基本一致,除了不支持 facet,以及 tooltip 属性值为 boolean 类型外,其他均同 chart 一致。
const view = chart.view({options: {scales: {object}, // 列定义声明coord: {object}, // 坐标系配置axes: {object}, // 坐标轴配置legends: {object}, // 图例配置guides: {array}, // 图表辅助元素配置filters: {object}, // 数据过滤配置tooltip: {boolean}, // 默认值为 true,显示 tooltip, false 为关闭 tooltipgeoms: {array} // 图形语法相关配置}});
