Grammer Of Graphics READNOTE

在公司confluence闲逛之际,发现了今年SEE(蚂蚁金服体验科技大会)关于前端数据可视化库G2的介绍。当下前端领域用以数据可视化的库特别多,最早我听说G2这个库是不以为然的,因为之前使用莆田echarts的感觉令人乏味和沮丧,可能大厂为了实现KPI造了这么一个新的轮子,无非是换换写法,发一些新的炫目的demo。而在我浏览了SEE对于G2的介绍后,被G2背后的设计理念所吸引。统计学家计算机科学家Leland Wilkinson 在1999年写了一本叫《Grammer Of Graphics》的书,创造了一种图形语法,通过这种抽象的机制,使得你不用为每一种新的图表重新做新的接口和新的实现,而是通过图形语法,描述数据集到图元的映射变换关系,非常合理,优雅和巧妙。

面向对象的图形系统

图形系统天然适合面向对象的设计范式。从面向对象的角度,不同的图元可以抽象称为不同的对象,如果这些对象之间的关系,通信,交流,可以通过一种统一的框架来定义描述,那么,我们就为图形系统设计了一套描述语言。

如何通过图形语法进行数据可视化

gog把 图形的绘制 抽象成三个阶段,分别是规范/定义(Specification),组装(Assembly),和显示(Display)。graphic即图形和picture图像是有本质区别的,在于图形构建与多种层次的规范之上,这些规范是对图形元素,绘制过程,关系,变换的抽象。比如数据相关的,描述了从数据集中提取图形需要展示的数据做为数据源,比如变换,描述了数据变量如何变化,比如排序过滤等操作,又比如图形系统内置的变换操作,缩放旋转,坐标系映射等。还有的就是侧重于描述图元的,数据被生成,变换到指定的形态的位置,总归需要去对应一个图元去表现,比如画什么形状,什么颜色之类。

组装,则是上述定义的实现,诸多规则的融合。组装的系统输入上述的规则,解析,实现,并输出序列化的图形绘制指令。交由显示系统,第三步进行绘制。

举例说一个饼图的例子。传统的,死板的无法扩展的实现是,写一个饼图的类,然后提供数据的接口和配置,数据需要满足非常死板的格式,配置只能支持固定的选项,然后实现绘制。而在图形语法的设计下是这样的: 首先通过数据集生成绘图的数据源,对于饼图而言,基本的图源是一个个扇形,扇形其实可以是矩形做了极坐标之后的结果,而我们的饼图很传统,半径是相同的,所以逐个比例的数据会被映射成2pi这个range里定高的矩形,然后再映射一个极坐标变换进去,再映射一个居中布局进去,你可以想象,通过一连串链式的变换调用,就实现了饼图,而其中任何一部都可以修改和复用。所以通过这种抽象机制,代码本身就表示了配置。

Part One 的一些核心概念的理解和内容简介

数据: 根据它们的功能和来源分为实际数据 抽象数据 元数据三类,实际数据可能具有表的结构,或者位图,或者单纯的流,或者单纯的数据对集合,就是所需要表现的核心数据。抽象数据是独立于前者内容数据之外的数据,它提供了额外的,独立的综合性信息,比如数据的迭代方式,数量,某个重要的常数,某个范围,百分比等,或者是单纯的函数。元数据描述了数据的数据,并不独立于实际数据,是实际数据的解释。

变量:组织数据的基本单元,数据,数据源首先被影射到变量,赋予语义。在实现上,对应了真实的显示系统内的数据结构。这些变量通过一些转化器transformer,无论是数学上的三角函数,还是统计上的平均方差,还是排序比较压缩范围,对这些数据进行处理,表示为转化器直接操作变量,像表达式一样进行组合这些转化器。

代数:转化器表达的是对单个数据的作用,代数系统则定义了不同数据之间的交互法则。主要举例了cross,blend,nest等操作。还讨论了它们的结合律分配律。并且将这种操作,类比到SQL的union,join上,很有意思。的确,SQL的确也是类似的体系和作用。

度量衡scale: 理解不确定:主要两块:1图表往往是具有物理上的意义的,如何建立单位和单位的转化体系,2 如何针对空间,时间上的分布,来设计合理的映射规则,比如周期性,对数坐标,误差模糊表示

统计:一组实用的工具函数,在之前的变换的基础上,提取和计算信息,创建统计相关的图元。比如根据数据,创建新的形状,点,分差,边界,voronoi,连接,聚类,平滑,平均, 分类等操作,包含了大量的统计和计算几何算法。是加工内容和核心过程。这一章份量比较大,举了很多例子。有些很高级的方法和操作可以搞出很厉害的图。

几何:统计围绕的是方法和过程,而几何则从图形本身的角度来介绍。主要分为functions, partitions, networks三类。functions主要是从数据建立几何,partitions主要从分割上来建立,networks则相反。Collision Modifier单独引入,用来重塑多个图形间的空间结构。

坐标系:主要介绍了各种坐标系,还有各种变幻。旋转缩放平移彷射投影镜像,各种都有,甚至包括地图投影,讨论范围也不仅仅限于23D。比较重要,内容非常多非常细致

美学: graph到graphics这个阶段,包含了非客观的,人的因素,图需要一个可感知的载体,如何去构建这样的图形,使得传递出清晰明确,充满价值的信息是本章讨论的主要内容。

了连续美学属性变化对人实际感知是非线性关系。 精神分析上,介绍了Fechner的人的可感知分别对刺激量呈现的边际递减效应。如果你试图依靠亮度之类的来表现,那么实际的数据需要进行伽马矫正之类的操作。

从认知心理学的角度,介绍了人对于图元和图形属性的认知顺序:普通位置>非对齐位置>长度>角度>面积>体积>颜色。然后讨论了不同类型的美学属性之间的相互影响,内容让我想起那本《写给大家看的设计书》里讲的一些类似于亲密性和重复原则。

维度对于图标而言,是最稀缺的资源,这个章节,讨论了在一个图中,如何使用少的维度,结合多个变量,同时受众依然能有效的提取信息。提出了整合维度,例如颜色的色相和亮度,和分离维度,如纹理和尺寸。我的理解是有些实体或者概念本身是由多个信息构成的,如果整合维度去表现,那么受众就很好理解,如果使用分离的维度表现,那么就丧失了整体的感性认识。

剩余部分介绍视觉上的因素,尺寸,形状,分辨率,色彩知识,纹理,粒度,图案,模糊,特效。配合有大量的例子

Facets:不知道怎么翻译为好,主要说的是Tables of Graphics,很多独立的相关的小图综合成整体的概念。很常见的做法。

引导: 就是引导内容的设计,分为Scales和Annotations,前者主要是起到尺度上指示作用的,例如坐标轴,图例,而后者是解释性的内容。