可视化框架设计-数据流

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

简介

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

回顾G2的数据流程:

image

注意:

  • 统计函数可以嵌入到语法中,所以也需要解释统计函数如何影响数据变化

数据流示例

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

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

原始数据

monthtempcityyear
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
过滤数据列

创建图表需要的数据,仅保留参与图形语法的字段

monthtempcity
1月5北京
2月10北京
1月8南京
2月14南京
  • 本示例中year字段未在语法中出现,所以过滤掉
统计函数执行

无统计函数,所以不执行统计函数

保存原始数据

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

monthtempcityorigin
1月5北京{month: '1月',temp: 5,city: '北京'}
2月10北京{...}
monthtempcityorigin
1月8南京{month: '1月',temp: 8,city: '南京'}
2月14南京{...}
转换成数字

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

monthtempcityorigin
050{month: '1月',temp: 5,city: '北京'}
1100{...}
monthtempcityorigin
081{month: '1月',temp: 8,city: '南京'}
1141{...}
调整数据

无调整

数据归一化
  • 由于月份Month是分类类型,又决定x轴的位置,由于分类类型,需要在坐标轴2端留下空白,所以数据归一化后的分布范围是[0.25-0.75]
  • city是分类类型,但是不参与位置运算,所以分布范围是[0-1]
  • temp是数字类型,为了让用户易于理解,坐标轴上的点是: [0,5,10,15,20],Min: 0,max: 20
monthtempcityorigin
0.250.250{month: '1月',temp: 5,city: '北京'}
0.750.50{...}
monthtempcityorigin
0.250.41{month: '1月',temp: 8,city: '南京'}
0.750.71{...}
计算图形生成需要的点
monthtempcityorigin
[0.25][0.25]0{month: '1月',temp: 5,city: '北京'}
[0.75][0.5]0{...}
monthtempcityorigin
[0.25][0.4]1{month: '1月',temp: 8,city: '南京'}
[0.75][0.7]1{...}
图形属性映射

由于y轴的方向是从下往上,所以 0.1 转换成画布坐标是 500 - 500 * 0.1

xycolororigin
[125][375]red{month: '1月',temp: 5,city: '北京'}
[375][250]red{...}
xycolororigin
[125][300]blue{month: '1月',temp: 8,city: '南京'}
[375][150]blue{...}
最后结果:

image

柱状图示例

interval 最简单的数据转化过程

语法
chart.interval().position('month*temp').color('city',['red','blue'])
创建图表需要的数据

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

monthtempcity
1月5北京
2月10北京
1月8南京
2月14南京
对数据分组

由于color属性对应的字段city是分类类型,所以对数据进行分组

monthtempcity
1月5北京
2月10北京
monthtempcity
1月8南京
2月14南京
统计函数执行

无统计函数,所以不执行统计函数

保存原始数据
monthtempcityorigin
1月5北京{month: '1月',temp: 5,city: '北京'}
2月10北京{...}
monthtempcityorigin
1月8南京{month: '1月',temp: 8,city: '南京'}
2月14南京{...}
转换成数字

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

monthtempcityorigin
050{month: '1月',temp: 5,city: '北京'}
1100{...}
monthtempcityorigin
081{month: '1月',temp: 8,city: '南京'}
1141{...}
调整数据

无调整

数据归一化
  • 由于月份Month是分类类型,又决定x轴的位置,由于分类类型,需要在坐标轴2端留下空白,所以数据归一化后的分布范围是[0.25-0.75]
  • city是分类类型,但是不参与位置运算,所以分布范围是[0-1]
  • temp是数字类型,为了让用户易于理解,坐标轴上的点是: [0,5,10,15,20],Min: 0,max: 20
monthtempcityorigin
0.250.250{month: '1月',temp: 5,city: '北京'}
0.750.50{...}
monthtempcityorigin
0.250.41{month: '1月',temp: 8,city: '南京'}
0.750.71{...}
计算图形生成需要的点
  • 由于区域图需要跟x轴形成闭合的区间,又是一个矩形,所以每个点会生成4个点
  • 柱状图的宽度,如果未指定size,则需要计算默认矩形的宽度,在这个示例,宽度 = 1/2/2 = 0.25,那么柱状图的x轴需要生成 x - 0.25/2 和 x + 0.25/2的2个点
  • 最终生成的图形是:
    4-3
    | |
    1-2
    
monthtempcityorigin
[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{...}
monthtempcityorigin
[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

xycolororigin
[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{...}
xycolororigin
[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'])
创建图表需要的数据

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

monthtempcity
1月5北京
2月10北京
1月8南京
2月14南京
对数据分组

由于color属性对应的字段city是分类类型,所以对数据进行分组

monthtempcity
1月5北京
2月10北京
monthtempcity
1月8南京
2月14南京
统计函数执行

无统计函数,所以不执行统计函数

保存原始数据
monthtempcityorigin
1月5北京{month: '1月',temp: 5,city: '北京'}
2月10北京{...}
monthtempcityorigin
1月8南京{month: '1月',temp: 8,city: '南京'}
2月14南京{...}
转换成数字

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

monthtempcityorigin
050{month: '1月',temp: 5,city: '北京'}
1100{...}
monthtempcityorigin
081{month: '1月',temp: 8,city: '南京'}
1141{...}
调整数据

因为interval存在 stack,所以需要对temp的数据进行层叠调整

monthtempcityorigin
0[0,5]0{month: '1月',temp: 5,city: '北京'}
1[0,10]0{...}
monthtempcityorigin
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
monthtempcityorigin
0.25[0,0.2]0{month: '1月',temp: 5,city: '北京'}
0.75[0,0.4]0{...}
monthtempcityorigin
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
    
monthtempcityorigin
[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{...}
monthtempcityorigin
[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

xycolororigin
[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{...}
xycolororigin
[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'])
创建图表需要的数据

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

monthtempcity
1月5北京
2月10北京
1月8南京
2月14南京
对数据分组

由于color属性对应的字段city是分类类型,所以对数据进行分组

monthtempcity
1月5北京
2月10北京
monthtempcity
1月8南京
2月14南京
统计函数执行

无统计函数,所以不执行统计函数

保存原始数据
monthtempcityorigin
1月5北京{month: '1月',temp: 5,city: '北京'}
2月10北京{...}
monthtempcityorigin
1月8南京{month: '1月',temp: 8,city: '南京'}
2月14南京{...}
转换成数字

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

monthtempcityorigin
050{month: '1月',temp: 5,city: '北京'}
1100{...}
monthtempcityorigin
081{month: '1月',temp: 8,city: '南京'}
1141{...}
调整数据

无调整

数据归一化
  • 由于月份Month是分类类型,又决定x轴的位置,由于分类类型,需要在坐标轴2端留下空白,所以数据归一化后的分布范围是[0.25-0.75]
  • city是分类类型,但是不参与位置运算,所以分布范围是[0-1]
  • temp是数字类型,为了让用户易于理解,坐标轴上的点是: [0,5,10,15,20],Min: 0,max: 20
monthtempcityorigin
0.250.250{month: '1月',temp: 5,city: '北京'}
0.750.50{...}
monthtempcityorigin
0.250.41{month: '1月',temp: 8,city: '南京'}
0.750.71{...}
计算图形生成需要的点
  • 由于区域图需要跟x轴形成闭合的区间,又是一个矩形,所以每个点会生成4个点
  • 柱状图的宽度,如果未指定size,则需要计算默认矩形的宽度,在这个示例,宽度 = 1/2/2 = 0.25,那么柱状图的x轴需要生成 x - 0.25/2 和 x + 0.25/2的2个点
  • 最终生成的图形是:
    4-3
    | |
    1-2
    
monthtempcityorigin
[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{...}
monthtempcityorigin
[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

xycolororigin
[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{...}
xycolororigin
[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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值