教程
统计简介
G2 做为 DT 时代 web 端数据分析的工具,最核心的部分是其数据分析能力,这些都是基于一系列的统计方法,在 G2 中的统计方法有以下功能:
- 将一个数据集合合并成一条数据或者多条记录,例如获取数据集合某一列的最大值、最小值和区间值;
- 对数据集合进行常见的统计操作:mean,median,mode,variance等常见操作;
- 支持统计方法嵌套,即可以执行连续的统计分析操作。
统计的分类
根据对数据的处理方式的不同,G2 中提供了以下几种统计函数:
- summary: 汇总统计,计算数据集合的 最大值、最小值、平均数等;
- bin:封箱统计,将数据划分成一个个的区域,然后在外面嵌套汇总统计;
- smooth:线性回归、非线性回归以及各种平滑插值算法,用于查找数据的规律;
- density:样本估计总体的概率密度;
- region:计算数值区间,误差区间等;
- map:用于绘制地图的统计函数,根据地名获取经纬度信息等;
- treemap:用于矩阵树图的绘制计算。
- link:用于计算关系图的边的坐标
以下是具体的统计函数介绍:
summary
统计名 | 解释 | 示例 |
---|---|---|
summary.min('x*y') | 计算列 y 的最小值,按照 x 进行分组 | 示例 |
summary.max('x*y') | 计算列 y 的最大值,按照 x 进行分组 | 示例 |
summary.sum('x*y') | 计算列 y 的和,按照 x 进行分组 | 示例 |
summary.range('x*y') | 计算列 y 的最大值、最小值区间的差值,按照 x 进行分组 | 示例 |
summary.mean('x*y') | 计算列 y 的平均值,按照 x 进行分组 | 示例 |
summary.median('x*y') | 计算列 y 的中位数,按照 x 进行分组 | 示例 |
summary.mode('x*y') | 计算列 y 的众数,按照 x 进行分组 | 示例 |
summary.sd('x*y') | 计算列 y 的标准差,按照 x 进行分组 | 示例 |
summary.count('x') | 计算按照 x 分组后,各个分组的个数 | 示例 |
summary.proportion('x') | 计算按照 x 分组后,各个分组的个数占总数的比例 | 示例 |
summary.percent('x*y') | 计算每个 y 所有数据 sum(y) 的比例 | 示例 |
summary.cumulative('x*y') | 计算累积值 | 示例 |
注意:
summary.<method>
可以接收多个列作为参数,例如:summary.max('x')
或者summary.max('x*y')
,此时用最后一个参数进行汇总统计,前面的参数用于分组,下面示例(钻石数据)表示,按照 'cut'(切割工艺)进行分组,然后统计每个分组的最大'price'(价格)
chart.point().position(Stat.summary.max('cut*price'));
summary 统计函数生成的新字段
需要说明的是,下面几个统计函数在统计过程中会生成新的字段:
- summary.count('x') 统计按照 'x' 分组后计算每个分组的个数,产生一个新的字段
..count
- summary.percent('x') 统计按照 'x' 分组后计算每个分组 x 字段的和占所有字段 x 和的比例,产生一个新的字段
..percent
- summary.proportion('x') 统计按照 'x' 分组后计算每个分组x字段个数,占总数的比例,产生一个新的字段
..proportion
bin
binWidth:用于指定如何对数据进行划分,默认为0.03,将 x轴,y轴划分成 1/0.03 大约33个分片,每个分片作为一个分组。
统计名 | 解释 | 示例 |
---|---|---|
bin.dot('x*y', binWidth) | 将 x,y 按照一定的比例进行划分多个区域,默认 0.03,将落到这个区域内的点的 x,y 变成统一的值 | 示例 |
bin.rect('x*y', binWidth) | 将x,y按照一定的比例进行划分多个区域,默认0.03,将落到这个区域内的点的x,y变成统一的值,可以通过这个统计函数获取出一个矩形范围 | 示例 |
bin.hex('x*y', binWidth) | 将x,y按照一定的比例进行划分多个区域,默认0.03,将落到这个区域内的点的x,y变成统一的值,可以通过这个统计函数获取出一个六边形范围 | 示例 |
bin.quantile.letter('x*y',binWidth) | 计算y 的四分位值,一般用于形成箱须图 | 示例 |
smooth
统计名 | 解释 | 示例 |
---|---|---|
smooth.linear('x*y') | 线性回归,生成一条线性回归曲线 | 示例 |
smooth.quadratic('x*y') | 二阶回归曲线 | 示例 |
smooth.cubic('x*y') | 三阶回归曲线 | 示例 |
smooth.log('x*y') | Log 回归曲线 | -- |
smooth.exp('x*y') | 次幂回归曲线 | 示例 |
smooth.loess.<kernelType>('x*y'[, bandWidth]) | 核函数局部回归曲线 | 示例 |
smooth.loess.<kernelType>('xyz'[, bandWidth]) | 核函数局部回归曲面 | 示例 |
kernelType:回归曲线函数类型,可选项:uniform、triangular、epanechnikov、quartic、triweight、tricube、gaussian、cosine;
bandwidth:代表核函数带宽占数据总范围的百分比,是可选的,默认0.01。
- Stat.smooth.loess.uniform('x*y'[, bandWidth]) 根据核函数 uniform 估计离散点数据的回归曲线;
- Stat.smooth.loess.triangular('x*y'[, bandWidth]) 根据核函数 triangular 估计离散点数据的回归曲线;
- Stat.smooth.loess.epanechnikov('x*y'[, bandWidth]) 根据核函数 epanechnikov 估计离散点数据的回归曲线;
- Stat.smooth.loess.quartic('x*y'[, bandWidth]) 根据核函数 quartic 估计离散点数据的回归曲线;
- Stat.smooth.loess.triweight('x*y'[, bandWidth]) 根据核函数 triweight 估计离散点数据的回归曲线;
- Stat.smooth.loess.tricube('x*y'[, bandWidth]) 根据核函数 tricube 估计离散点数据的回归曲线;
- Stat.smooth.loess.gaussian('x*y'[, bandWidth]) 根据核函数 gaussian 估计离散点数据的回归曲线;
- Stat.smooth.loess.cosine('x*y'[, bandWidth]) 根据核函数 cosine 估计离散点数据的回归曲线。
density
根据核函数估计数据的分布密度函数。
统计名 | 解释 | 示例 |
---|---|---|
density.kernel.<kernelType>('x'[, bandwidth]) | 核密度估计概率密度曲线 | 示例 |
density.kernel.<kernelType>('x*y'[, bandwidth]) | 核密度估计概率密度曲面 | 示例 |
density.normal('x', 0.01) | 正态分布估计概率密度 | 示例 |
kernelType:核函数类型,可选项:uniform、triangular、epanechnikov、quartic、triweight、tricube、gaussian、cosine;
bandwidth:代表核函数带宽占数据总范围的百分比,是可选的,默认0.01。
- Stat.density.uniform('x'[, bandWidth]) 根据核函数 uniform 估计数据的概率密度函数;
- Stat.density.triangular('x'[, bandWidth]) 根据核函数 triangular 估计数据的概率密度函数;
- Stat.density.epanechnikov('x'[, bandWidth]) 根据核函数 epanechnikov 估计数据的概率密度函数;
- Stat.density.quartic('x'[, bandWidth]) 根据核函数 quartic 估计数据的概率密度函数;
- Stat.density.triweight('x'[, bandWidth]) 根据核函数 triweight 估计数据的概率密度函数;
- Stat.density.tricube('x'[, bandWidth]) 根据核函数 tricube 估计数据的概率密度函数;
- Stat.density.gaussian('x'[, bandWidth]) 根据核函数 gaussian 估计数据的概率密度函数;
- Stat.density.cosine('x'[, bandWidth]) 根据核函数 cosine 估计数据的概率密度函数。
region
统计名 | 解释 | 示例 |
---|---|---|
region.spread.range('x*y') | 计算列y的最大值、最小值,构成一个数组,按照x进行分组 | 示例 |
region.spread.sd('x*y') | 计算列y的标准差的上下范围,构成一个数组,按照x进行分组 | 示例 |
map
统计名 | 解释 | 示例 |
---|---|---|
map.region('name') | 计算对应名称的图形的坐标区域:name 地名,返回格式: [[经度], [纬度]]。 |
示例 |
map.center('name') | 返回对应名称区域的中心点坐标:name 地名,返回格式: [经度, 纬度] |
示例 |
map.name('x*y') | 根据提供的经纬度坐标,获取该坐标对应的区域地名:x 代表经度,y 代表纬度 |
|
map.location('x*y') | 根据传入的 x y 地理坐标点将点定位到相应的位置:x 代表经度,y 代表纬度 |
示例 |
map 对应的统计函数都会自动生成两个经纬度字段:
- ..long 经度
- ..lant 维度
treemap
统计名 | 解释 | 示例 |
---|---|---|
treemap('children*value') | 用于生成简单的 treemap | 示例 |
treemap.squarify('children*value') | 划分成比例合适的矩形 | |
treemap.sliceDice('children*value') | 是横竖交替的划分,适用于极坐标 | 示例 |
treemap的统计函数,都是传入chilren字段和value字段来计算treemap的范围,所以都会自动生成两个字段:
- ..x,是一个数组,有4个值,每个值代表一个顶点的x坐标
- ..y,是一个数组,有4个值,每个值代表一个顶点的y坐标
link
统计名 | 解释 | 示例 |
---|---|---|
link('source*target',nodes) | 生成指定节点的链接 | 示例 |
link.weight('source target weight',nodes) | 生成指定节点的有宽度的连接线 | |
link.weight('source target sourceWeight * targetWeight',nodes) | 生成指定节点的有宽度变化的连接线 | 示例 |
link.sankey('source target weight',nodes) | 生成桑基图中指定节点的有宽度的连接线 | 示例 |
link 统计函数假定了传入的nodes节点存在以下字段:
- id 用于判定source,target字段对应的节点
- x 节点的x坐标
- y 节点的y坐标
自动生成了表示x,y坐标的字段:
- ..x, x轴方向的坐标位置,是个二维数组,不带权重时表示起点和终点的x坐标,带权重时表示四个顶点的x坐标
- ..y, y轴方向的坐标位置,是个二维数组,不带权重时表示起点和终点的y坐标,带权重时表示四个顶点的y坐标
示例
- 示例 1:使用 bin.rect 和 summary.count 统计函数绘制马赛克图。
$.getJSON('../../static/data/diamond.json',function (data) {
var Stat = G2.Stat;
var chart = new G2.Chart({
id : 'c1',
width : 800,
height : 400
});
chart.source(data);
chart.polygon().position(Stat.bin.rect('carat*price',0.01)).color(Stat.summary.count(),'lightness');
chart.render();
});
- 示例二:嵌套使用统计函数 bin.rect 和 summary.count 绘制直方图。
$.getJSON('../../static/data/car.json',function (data) {
var Stat = G2.Stat;
var chart = new G2.Chart({
id : 'c2',
width : 800,
height : 400
});
chart.source(data);
chart.interval().position(Stat.summary.count(Stat.bin.rect('hwy')));
chart.render();
});