配置项声明方式
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 clock
- cfg: {object}, // 对应各个 type 坐标系属性配置,同 `chart.coord(type, cfg)` 中的 cfg
- actions: {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 schemaDodge
- adjust: {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 为关闭 tooltip
- geoms: {array} // 图形语法相关配置
- }
- });