anhongpeng / blog Goto Github PK
View Code? Open in Web Editor NEW旧版博客迁移中...
旧版博客迁移中...
2018.01.06 发布,最后更新于 2019.07.18
1024 条数据的情况下折线图的性能对比(3.0 做了 Canvas 图层合并、数据处理 DateSet 模块外置,将数据处理与图表绘制解耦):
数据可视化的目的 在于用图形化的手段,清晰有效地传达和沟通信息,一图胜千言。
Leland Wilkinson 在上世纪90年代开发可视化软件时编写了《The Grammar of Graphics》,用语法描述图形的产生,以自底向上的方式 组织最基本的元素形成更高级的元素。此后,开源社区逐渐诞生了对图形语法的各种语言版本实现: R 语言社区的 ggplot2;Python 技术栈实现的 Bokeh;基于 D3 的 Vega。G2 是目前 JavaScript 社区对《The Grammar of Graphics》还原度最高的实现,刚一开源就得到 Leland Wilkinson 本人的肯定。
和传统 枚举图表类型 的可视化工具相比,基于图形语法的可视化工具的特征是:生成每一个图形的过程就是组合不同的基础图形语法的过程。图形语法的灵活和强大之处就在于,我们只需要改动其中某一步的处理过程,就能得到完全不同的、全新的图表。
参考 可视化图形语法概述
Anv 官推的基于 G2 的 React 图表库。
此外,Viser 对 G2 3.0 做了通用的抽象,已经支持对 React、Angular、Vue 三个框架的深度整合,对应的是 viser-react、viser-ng 和 viser-vue。
自 G2 3.0 版本开始,原先内置的数据处理模块 frame 从 G2 包中抽离出来,独立成为 DataSet 包。DataSet 的目标是为数据可视化场景提供 状态驱动(state driven) 的、丰富而强大的数据处理能力。
旧版本中,数据处理模块是和 G2 强耦合的,统计处理甚至会入侵到图形语法中。这会带来几方面的问题:
基于这些考虑,AntV 团队认真梳理了底层架构,决定从 G2 中把数据处理部分抽离出来,封装成了一个专门的数据处理模块 DataSet。从此 G2 内部不再有数据处理、布局和统计方面的代码包袱,继续专注强化“高交互图形语法”方面的特长;而独立的 DataSet 模块则通过简单、强包容性的架构,以及 状态量等策略 扫除了升级扩展的障碍,得以从开源社区大量借力,不断丰富 “数据驱动” 这一特性的内涵。
G2 3.0 不强依赖 DataSet,在不需要复杂数据处理时可以不引入。
独立出来的 DataSet 主要提供三个方面的能力:
Connector
负责导入和归一化数据(譬如导入 CSV 数据,导入 GeoJSON 数据等)dv.source(csvStr, {
type: 'csv', // 指定使用dsv connector
delimiter: ',' // 指定分隔符
})
Transform
负责进行各种数据转换操作(譬如图布局、数据统计、数据补全等)// 统计某个维度下某个字段的值占总和的比例
// 每个不同的 dimension 下,field 值占总和的百分比
dv.transform({
type: 'percent', // 统计类型为 总和百分比
field: 'sold', // 是统计发生的字段(求和,求百分比),统计销量
dimension: 'year', // 统计的维度字段,每年的占比
as: 'percent' // 结果存储在 percent 字段
});
// step1: 创建 DataSet, 指定状态量
const ds = new DataSet({
state: {
year: '2010'
}
});
// step2: 创建 DataView
const dv = ds.createView().source(data);
dv.transform({
type: 'filter',
callback(row) { // 判断某一行是否保留,默认返回 true
return row.year === ds.state.year;
}
});
// step3: 引用 DataView
chart.source(dv);
// step4 更新状态量
ds.setState('year', '2012');
G2 中并没有特定的图表类型(柱状图、散点图、折线图等)的概念,G2 生成的图表类型,主要由几何标记决定。几何标记用来描述 点、线、面这些几何图形。
业务中最常用的几何标记类型:
Geom | 图表类型 | 描述 |
---|---|---|
point |
点图、折线图中的点 | 点,用于绘制各种点图。 |
line |
折线图、曲线图、阶梯线图 | 线,点按照 x 轴连接成一条线,构成线图。 |
area |
区域图(面积图)、层叠区域图、区间区域图 | 填充线图跟坐标系之间构成区域图,也可以指定上下范围。 |
interval |
柱状图、饼图、直方图、南丁格尔玫瑰图、条形环图(玉缺图)、漏斗图等 | 使用矩形或者弧形,用面积来表示大小关系的图形,一般构成柱状图、饼图等图表。 |
几何标记(Geom)和视觉通道构成了可视化编码,G2 图表类型使用教程 从 Geom 数据维度、Geom 自由度、视觉通道、图形形状 4个角度描述了 “图表类型” 在可视化框架中的实现思路。
图形属性对应视觉编码中的 视觉通道,不同的几何标记拥有自己的图形属性。
G2 支持以下图形属性:
图形属性是属于每一个几何标记 geom(Geometry) 的,所以我们先要声明几何标记,然后再在该几何标记对象上进行图形属性的映射,Eg.
chart.point().position('a*b').color('c');
G2 包含了两种类型坐标系(polar、theta、helix 均属于极坐标),目前所有的坐标系均是 2 维的。
coordType | 说明 |
---|---|
rect |
直角坐标系,目前仅支持二维,由 x, y 两个互相垂直的坐标轴构成。 |
polar |
极坐标系,由角度和半径 2 个维度构成。 |
theta |
一种特殊的极坐标系,半径长度固定,仅仅将数据映射到角度,常用于饼图的绘制。 |
helix |
螺旋坐标系,基于阿基米德螺旋线。 |
坐标系类型的变换会改变几何标记的形状:在极坐标系中,矩形将变为圆环的一部分,而地图中两点间的最短路径也将不是直线。
例如下图展示的层叠柱状图,在不同坐标系下就变换成了其他的图表类型:
上图左侧为层叠柱状图,中间的饼图则是层叠柱状图在极坐标下对 x y 两个坐标轴进行转置后的结果,其中 x 轴被映射为半径,y 轴被映射成了角度。而最右边的牛眼图则相反,y 轴映射为半径。
// 设置坐标系
chart.coord('coordType'[, cfg]);
G2 提供的坐标系支持一系列的变换操作:旋转(rotate)、缩放(scale)、X、Y轴交换(transpose)、镜像(reflect)
// 坐标系变换
chart.coord().rotate(90).scale(1.3, 5).reflect('x').transpose();
chart 对象提供了各种事件支持,G2 中,我们将事件分为如下事件:
chart.on('mousedown', ev => {});
chart.on('plotenter', ev => {});
chart.on('tooltip:show', ev => {}); // tooltip 展示
chart.on('axis-label:click', ev => {});
Eg. 饼图点击跳转
const { DataView } = DataSet;
const data = [
{ item: '事例一', count: 40 },
{ item: '事例二', count: 21 },
{ item: '事例三', count: 17 },
{ item: '事例四', count: 13 },
{ item: '事例五', count: 9 }
];
// 创建视图对象
const dv = new DataView();
// 进行百分比统计
dv.source(data).transform({
type: 'percent',
field: 'count',
dimension: 'item',
as: 'percent'
});
// 创建图表,绑定 DOM 容器
const chart = new G2.Chart({
container: 'mountNode',
forceFit: true,
height: window.innerHeight,
});
// 为 chart 装载数据
chart.source(dv, {
percent: { // 用于数据字段的列定义,如设置数据的类型,显示别名,时间类型的展示格式等,不同的数据类型的配置项不同
formatter: val => {
return (val * 100) + '%';
}
}
});
// 坐标系设置
chart.coord('theta', {
radius: 0.75
});
// tooltip 设置
chart.tooltip({
showTitle: false,
itemTpl: '<li><span style="background-color:{color};" class="g2-tooltip-marker"></span>{name}: {value}</li>'
});
// Geom 几何标记、视觉通道 映射
chart.intervalStack()
.position('percent')
.color('item')
.label('percent', {
formatter: (val, item) => {
return item.point.item + ': ' + val;
}
})
.tooltip('item*percent', (item, percent) => {
return {
name: item,
value: (percent * 100) + '%'
};
})
.style({
lineWidth: 1,
stroke: '#fff'
});
// 将图表渲染至画布
chart.render();
独立的数据处理模块(DateSet)支持多种数据源的解析,可以将 csv、dsv、GeoJSON 转换成标准 JSON
AntV 3.0 版本中,图表上的 任意元素 均可捕获鼠标和触摸事件,提供了更精准的事件监听!
只需要在 chart 或者 view 上监听该元素对应的事件名即可(元素名+基础事件名的方式组合),Eg:
// 监听坐标轴文本的鼠标事件
chart.on('axis-label:mouseenter', ev => {});
chart.on('axis-label:mouseleave', ev => {});
chart.on('axis-label:click', ev => {});
分面,将一份数据按照某个维度分隔成若干子集,然后创建一个图表的矩阵,将每一个数据子集绘制到图形矩阵的窗格中。
直接调用 chart.downloadImage();
即可导出图片。
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.