可视化框架设计-数据流

  • 简介
  • 数据流示例
  • 更多

简介

在总体思路章节中咱们讲解过可视化总体的数据流程和G2的数据流程,本章以最简单的点图和柱状图为示例展现每一步数据是如何转变的。函数

回顾G2的数据流程:spa

image

注意:code

  • 统计函数能够嵌入到语法中,因此也须要解释统计函数如何影响数据变化

数据流示例

咱们以最简单的月份、天气、城市的数据为例解释数据如何发生数据图形映射,如何绘制的。blog

假设 500*500的图表绘制区域ip

原始数据

month temp city year
1月 5 北京 2001
2月 10 北京 2001
1月 8 南京 2003
2月 14 南京 2004

点图示例

设置数据源

chart.source(data);

设置语法

chart.point().position('month*temp').color('city',['red','blue']) 
  • 将month映射到position的水平(x轴)方向
  • 将temp映射到position的垂直(y轴)方向
  • 将city映射到color

过滤数据列

建立图表须要的数据,仅保留参与图形语法的字段ci

month temp city
1月 5 北京
2月 10 北京
1月 8 南京
2月 14 南京
  • 本示例中year字段未在语法中出现,因此过滤掉

统计函数执行

无统计函数,因此不执行统计函数string

保存原始数据

此时将原始数据保存下来,方便后期tooltip取对应的数据it

month temp city origin
1月 5 北京 {month: '1月',temp: 5,city: '北京'}
2月 10 北京 {...}
month temp city origin
1月 8 南京 {month: '1月',temp: 8,city: '南京'}
2月 14 南京 {...}

转换成数字

分类类型month,city都转换成数字io

month temp city origin
0 5 0 {month: '1月',temp: 5,city: '北京'}
1 10 0 {...}
month temp city origin
0 8 1 {month: '1月',temp: 8,city: '南京'}
1 14 1 {...}

调整数据

无调整table

数据归一化

  • 因为月份Month是分类类型,又决定x轴的位置,因为分类类型,须要在坐标轴2端留下空白,因此数据归一化后的分布范围是[0.25-0.75]
  • city是分类类型,可是不参与位置运算,因此分布范围是[0-1]
  • temp是数字类型,为了让用户易于理解,坐标轴上的点是: [0,5,10,15,20],Min: 0,max: 20
month temp city origin
0.25 0.25 0 {month: '1月',temp: 5,city: '北京'}
0.75 0.5 0 {...}
month temp city origin
0.25 0.4 1 {month: '1月',temp: 8,city: '南京'}
0.75 0.7 1 {...}

计算图形生成须要的点

month temp city origin
[0.25] [0.25] 0 {month: '1月',temp: 5,city: '北京'}
[0.75] [0.5] 0 {...}
month temp city origin
[0.25] [0.4] 1 {month: '1月',temp: 8,city: '南京'}
[0.75] [0.7] 1 {...}

图形属性映射

因为y轴的方向是从下往上,因此 0.1 转换成画布坐标是 500 - 500 * 0.1

x y color origin
[125] [375] red {month: '1月',temp: 5,city: '北京'}
[375] [250] red {...}
x y color origin
[125] [300] blue {month: '1月',temp: 8,city: '南京'}
[375] [150] blue {...}

最后结果:

image

柱状图示例

interval 最简单的数据转化过程

语法

chart.interval().position('month*temp').color('city',['red','blue']) 

建立图表须要的数据

仅保留参与图形语法的字段

month temp city
1月 5 北京
2月 10 北京
1月 8 南京
2月 14 南京

对数据分组

因为color属性对应的字段city是分类类型,因此对数据进行分组

month temp city
1月 5 北京
2月 10 北京
month temp city
1月 8 南京
2月 14 南京

统计函数执行

无统计函数,因此不执行统计函数

保存原始数据

month temp city origin
1月 5 北京 {month: '1月',temp: 5,city: '北京'}
2月 10 北京 {...}
month temp city origin
1月 8 南京 {month: '1月',temp: 8,city: '南京'}
2月 14 南京 {...}

转换成数字

分类类型month,city都转换成数字

month temp city origin
0 5 0 {month: '1月',temp: 5,city: '北京'}
1 10 0 {...}
month temp city origin
0 8 1 {month: '1月',temp: 8,city: '南京'}
1 14 1 {...}

调整数据

无调整

数据归一化

  • 因为月份Month是分类类型,又决定x轴的位置,因为分类类型,须要在坐标轴2端留下空白,因此数据归一化后的分布范围是[0.25-0.75]
  • city是分类类型,可是不参与位置运算,因此分布范围是[0-1]
  • temp是数字类型,为了让用户易于理解,坐标轴上的点是: [0,5,10,15,20],Min: 0,max: 20
month temp city origin
0.25 0.25 0 {month: '1月',temp: 5,city: '北京'}
0.75 0.5 0 {...}
month temp city origin
0.25 0.4 1 {month: '1月',temp: 8,city: '南京'}
0.75 0.7 1 {...}

计算图形生成须要的点

  • 因为区域图须要跟x轴造成闭合的区间,又是一个矩形,因此每一个点会生成4个点
  • 柱状图的宽度,若是未指定size,则须要计算默认矩形的宽度,在这个示例,宽度 = 1/2/2 = 0.25,那么柱状图的x轴须要生成 x - 0.25/2 和 x + 0.25/2的2个点
  • 最终生成的图形是:
    4-3 | | 1-2 
month temp city origin
[0.125,0.375,0.125,0.375] [0,0,0.25,0.25] 0 {month: '1月',temp: 5,city: '北京'}
[0.625,0.875,0.75,0.875] [0,0,0.5,0.5] 0 {...}
month temp city origin
[0.125,0.375,0.125,0.375] [0,0,0.4,0.4] 1 {month: '1月',temp: 8,city: '南京'}
[0.625,0.875,0.75,0.875] [0,0,0.7,0.7] 1 {...}

图形属性映射

因为y轴的方向是从下往上,因此 0.1 转换成画布坐标是 500 - 500 * 0.1

x y color origin
[62.5,187.5,62.5,187.5] [500,500,375,375] red {month: '1月',temp: 5,city: '北京'}
[375,375] [500,500,250,250] red {...}
x y color origin
[62.5,187.5,62.5,187.5] [500,500,300,300] blue {month: '1月',temp: 8,city: '南京'}
[312.5,437.5,312.5,437.5] [500,500,150,150] blue {...}

执行结果

image

  • 此时不一样城市相同月份的柱状图被遮挡了,因此仅显示了2条数据,能够经过层叠或者分组调整数据

柱状图层叠

语法

chart.intervalStack().position('month*temp').color('city',['red','blue']) 

建立图表须要的数据

仅保留参与图形语法的字段

month temp city
1月 5 北京
2月 10 北京
1月 8 南京
2月 14 南京

对数据分组

因为color属性对应的字段city是分类类型,因此对数据进行分组

month temp city
1月 5 北京
2月 10 北京
month temp city
1月 8 南京
2月 14 南京

统计函数执行

无统计函数,因此不执行统计函数

保存原始数据

month temp city origin
1月 5 北京 {month: '1月',temp: 5,city: '北京'}
2月 10 北京 {...}
month temp city origin
1月 8 南京 {month: '1月',temp: 8,city: '南京'}
2月 14 南京 {...}

转换成数字

分类类型month,city都转换成数字

month temp city origin
0 5 0 {month: '1月',temp: 5,city: '北京'}
1 10 0 {...}
month temp city origin
0 8 1 {month: '1月',temp: 8,city: '南京'}
1 14 1 {...}

调整数据

由于interval存在 stack,因此须要对temp的数据进行层叠调整

month temp city origin
0 [0,5] 0 {month: '1月',temp: 5,city: '北京'}
1 [0,10] 0 {...}
month temp city origin
0 [5,13] 1 {month: '1月',temp: 8,city: '南京'}
1 [10,24] 1 {...}

数据归一化

  • 因为月份Month是分类类型,又决定x轴的位置,因为分类类型,须要在坐标轴2端留下空白,因此数据归一化后的分布范围是[0.25-0.75]
  • city是分类类型,可是不参与位置运算,因此分布范围是[0-1]
  • temp是数字类型,为了让用户易于理解,同时数据进行层叠处理后,坐标轴上的点是: [0,5,10,15,20,25],Min: 0,max: 25
month temp city origin
0.25 [0,0.2] 0 {month: '1月',temp: 5,city: '北京'}
0.75 [0,0.4] 0 {...}
month temp city origin
0.25 [0.2,0.52] 1 {month: '1月',temp: 8,city: '南京'}
0.75 [0.4,24/25] 1 {...}

计算图形生成须要的点

  • 因为区域图须要跟x轴造成闭合的区间,又是一个矩形,因此每一个点会生成4个点
  • 柱状图的宽度,若是未指定size,则须要计算默认矩形的宽度,在这个示例,宽度 = 1/2/2 = 0.25,那么柱状图的x轴须要生成 x - 0.25/2 和 x + 0.25/2的2个点
  • 最终生成的图形是:
    4-3 | | 1-2 
month temp city origin
[0.125,0.375,0.125,0.375] [0,0,0.2,0.2] 0 {month: '1月',temp: 5,city: '北京'}
[0.625,0.875,0.75,0.875] [0,0,0.4,0.4] 0 {...}
month temp city origin
[0.125,0.375,0.125,0.375] [0.2,0.2,0.52,0.52] 1 {month: '1月',temp: 8,city: '南京'}
[0.625,0.875,0.75,0.875] [0.4,0.4,24/25,24/25] 1 {...}

图形属性映射

因为y轴的方向是从下往上,因此 0.1 转换成画布坐标是 500 - 500 * 0.1

x y color origin
[62.5,187.5,62.5,187.5] [500,500,400,400] red {month: '1月',temp: 5,city: '北京'}
[375,375] [500,500,300,300] red {...}
x y color origin
[62.5,187.5,62.5,187.5] [400,400,260,260] blue {month: '1月',temp: 8,city: '南京'}
[312.5,437.5,312.5,437.5] [300,300,20,20] blue {...}

结果

image

柱状图的分组

语法

chart.interval().position('month*temp').color('city',['red','blue']) 

建立图表须要的数据

仅保留参与图形语法的字段

month temp city
1月 5 北京
2月 10 北京
1月 8 南京
2月 14 南京

对数据分组

因为color属性对应的字段city是分类类型,因此对数据进行分组

month temp city
1月 5 北京
2月 10 北京
month temp city
1月 8 南京
2月 14 南京

统计函数执行

无统计函数,因此不执行统计函数

保存原始数据

month temp city origin
1月 5 北京 {month: '1月',temp: 5,city: '北京'}
2月 10 北京 {...}
month temp city origin
1月 8 南京 {month: '1月',temp: 8,city: '南京'}
2月 14 南京 {...}

转换成数字

分类类型month,city都转换成数字

month temp city origin
0 5 0 {month: '1月',temp: 5,city: '北京'}
1 10 0 {...}
month temp city origin
0 8 1 {month: '1月',temp: 8,city: '南京'}
1 14 1 {...}

调整数据

无调整

数据归一化

  • 因为月份Month是分类类型,又决定x轴的位置,因为分类类型,须要在坐标轴2端留下空白,因此数据归一化后的分布范围是[0.25-0.75]
  • city是分类类型,可是不参与位置运算,因此分布范围是[0-1]
  • temp是数字类型,为了让用户易于理解,坐标轴上的点是: [0,5,10,15,20],Min: 0,max: 20
month temp city origin
0.25 0.25 0 {month: '1月',temp: 5,city: '北京'}
0.75 0.5 0 {...}
month temp city origin
0.25 0.4 1 {month: '1月',temp: 8,city: '南京'}
0.75 0.7 1 {...}

计算图形生成须要的点

  • 因为区域图须要跟x轴造成闭合的区间,又是一个矩形,因此每一个点会生成4个点
  • 柱状图的宽度,若是未指定size,则须要计算默认矩形的宽度,在这个示例,宽度 = 1/2/2 = 0.25,那么柱状图的x轴须要生成 x - 0.25/2 和 x + 0.25/2的2个点
  • 最终生成的图形是:
    4-3 | | 1-2 
month temp city origin
[0.125,0.375,0.125,0.375] [0,0,0.25,0.25] 0 {month: '1月',temp: 5,city: '北京'}
[0.625,0.875,0.75,0.875] [0,0,0.5,0.5] 0 {...}
month temp city origin
[0.125,0.375,0.125,0.375] [0,0,0.4,0.4] 1 {month: '1月',temp: 8,city: '南京'}
[0.625,0.875,0.75,0.875] [0,0,0.7,0.7] 1 {...}

图形属性映射

因为y轴的方向是从下往上,因此 0.1 转换成画布坐标是 500 - 500 * 0.1

x y color origin
[62.5,187.5,62.5,187.5] [500,500,375,375] red {month: '1月',temp: 5,city: '北京'}
[375,375] [500,500,250,250] red {...}
x y color origin
[62.5,187.5,62.5,187.5] [500,500,300,300] blue {month: '1月',temp: 8,city: '南京'}
[312.5,437.5,312.5,437.5] [500,500,150,150] blue {...}

执行结果

image

更多

本章仅仅以点图和柱状图为例介绍了G2在处理数据视觉通道映射的过程当中的数据流程,不一样的图表的差别主要在于图形生成须要的点,更多的详细信息查看各个图表类型所在的章节。下一章咱们开始进入图形类型的介绍

 

G2: https://g2.alipay.com

相关文章
相关标签/搜索