
2.3 Altair的语法规则
在介绍Altair的语法规则之前,先回顾一下生成图2.22的代码。

在这行代码中,主要由导入数据、设计数据编码样式和指定映射通道信息3个部分组成。这3个部分分别对应代码中的Chart()、mark_point()和encode()。接下来,我们就围绕这行代码详细介绍Altair的语法规则。
2.3.1 Altair的数据结构
在Altair中,使用的数据结构主要是Pandas中的DataFrame,因为DataFrame是一种类似Excel表格形式的数据结构,是一种“整洁格式”的二维表格。这也是统计可视化的特点之一,通过“分类、汇总和排列”等统计技术,形成可读程度很高的表格。而且,Altair提供的数据集及外部文件一般都可以通过Pandas的API函数以DataFrame的数据格式被加载。除了DataFrame,Altair还接受以下几种数据结构。
• 对象Data,例如,alt.Data(values = [{"a": "D", "b": 3}, {"a": "B", "b": 6}, {"a": "A", "b": 5}])。
• 使用属性url指向JSON或CSV格式的文本文件,例如,Altair的cars和airports数据集,使用data.cars.url或data.airports.url方法加载JSON/CSV格式的文本文件。
在使用实例方法encode()的过程中,经常看到“Q”、“N”、“O”和“T”,这是变量类型的缩写形式。也就是说,Altair需要了解绘制图形使用的变量类型,只有这样,绘制的图形才是我们期望的效果。在Altair中,变量类型具有非常重要的作用,简单地添加变量不一定能获得正确的统计图形,而是需要明确指出每个字段的变量类型,展现重视数据和强调统计的功能特点,也解释了统计可视化与数据可视化的不同之处。同时,也体现了更好地认识数据、理解数据和探索数据的设计初衷。Altair变量类型的具体内容如表2.1所示。
表2.1

说明:在Altair中,若变量取值是字符串,则默认变量类型为名义型变量;若变量取值是数值,则默认变量类型为数量型变量;若变量取值是日期或时间,则变量类型默认设定为时间型变量。另外,名义型变量和次序型变量统称为离散型变量,时间型变量称为连续型变量。
注意:如果数量型变量的取值是间断的离散数据,那么数量型变量就称为离散型变量;如果数量型变量的取值是不间断的连续数据,那么数量型变量就称为连续型变量。
2.3.2 Altair的基本对象
在Altair中,创建一个基本的图形,需要使用类alt.Chart(),返回值是基本对象Chart。使用类alt.Chart()可以绘制大部分的统计图形,可以通过alt.Chart()的关键字参数实现指定数据源和图形样式等需求。除了关键字参数data,类alt.Chart()还有一些关键字参数需要掌握,这些关键字参数的名称和功能如表2.2所示。
表2.2

类alt.Chart()的关键字参数也是基本对象Chart的属性,属性mark指定将可视化属性在图形区域以何种样式呈现。属性encoding将数据属性(数据列)映射成可视化属性,这也是创建有意义的可视化作品的关键,以达到高效传递信息的目的。属性mark和属性encoding与对应的实例方法有以下对应关系。
• 属性mark⇋实例方法mark_*()
• 属性encoding⇋实例方法encode()
一般地,使用基本对象Chart的实例方法mark_*()描述数据编码的样式,样式包括形状(标记)、大小、方向、长度和颜色。使用实例方法encode()完成从数据列到可视化属性映射的过程,主要包括数据列的映射通道的设置,不同映射通道上数据列的颜色、形状及位置的编码,提示信息的设置等。
接下来,介绍一下类alt.Chart()可以接收的数据源类型,也就是数据结构。
类alt.Chart()通过关键字参数data接收数据源,关键字参数data的参数值可以是DataFrame、对象Data和使用属性url指向的JSON/CSV格式的文本文件。下面用一个示例介绍这3种参数值的使用方法。
(1)导入需要的包。

(2)分别定义3种数据结构:DataFrame、对象Data和文本文件。

(3)将3种数据结构作为关键字参数data的参数值,传入类alt.Chart(),返回对象Chart,用变量存储。

(4)由于df1和df2中含有名义型数据(Nominal),所以使用柱体表示数据的类别,如图2.25和图2.26所示;由于df3中数值型数据占多数,所以使用圆形表示数据的位置,如图2.27所示。


图2.25


图2.26


图2.27
通过比较图2.25和图2.26,可以知道df1和df2是相同数据集的两种表格样式。df3中的名义型数据Origin作为分类数据将不同国家的圆形使用不同的颜色标记,也可以使用实心圆点编码数据。输出结果如图2.28所示。


图2.28
我们除了使用实例方法mark_bar()、mark_point()和mark_circle()编码数据,还可以通过alt.Chart()的关键字参数mark编码数据。关键字参数mark的参数值用于描述编码数据的形状,例如,"bar","circle","square","tick","line","area"和"point"等。

输出结果如图2-29所示。

图2.29

输出结果如图2-30所示。

图2.30
因为没有指定映射通道,只是简单地用柱体编码数据,所以图2.29和图2.30的可视化效果一致。为了让数据更加清晰地展现出来,需要指定映射通道,也就是说,需要描述编码数据的位置。因此,需要借助坐标系统的帮助,使用x轴描述名义型变量的不同取值,使用y轴描述数量型变量的具体取值,这样,就将名义型变量映射在x轴上面,数量型变量映射在y轴上面。在Altair的语法规则中,使用关键字参数encoding描述变量的映射过程,也就是指定变量的编码通道的类型,在链式法则中,可以使用实例方法encode()。关键字参数encoding的参数值是映射模式的字典,例如,使用键"x"表示x轴,使用键对应的值{"type": "nominal", "field": "a"}描述映射在x轴上的变量名称和变量类型,其中,使用键"field"表示变量名称,使用键"type"表示变量类型。

输出结果如图2-31所示。

图2.31

输出结果如图2-32所示。

图2.32
通过比较图2.31和图2.32,可以看到使用关键字参数encoding和实例方法encode()的可视化效果一致。因为类alt.Chart()的关键字参数也是基本对象Chart的属性,因此基本对象Chart的属性值可以通过类alt.Chart()的关键字参数查看。

也可以通过重新设置属性值的方式,重新赋值关键字参数。

输出结果如图2.33所示。

图2.33
最后,我们通过图2.34所示的Altair图形语法,更加直观地理解Altair的声明式统计可视化的设计理念和使用框架。

图2.34
通过图2.34可以知道,这是将数据映射成视觉暗示的过程。而且,绘制柱形图既可以使用关键字参数(属性),也可以使用实例方法,它们之间的对应关系如表2.3所示。
表2.3

因此,无论是使用关键字参数还是实例方法,绘制图形的关键都是样式(mark)和映射通道(encoding),这也是图形语法的核心:将不同维度的数据按照映射通道(x轴和y轴)映射到坐标系统上,以位置、形状(标记)、大小、方向、长度和颜色等编码数据,实现从数据到视觉暗示的映射过程。
2.3.3 Altair的展示方法
在Altair中,展示统计可视化主要使用前端渲染的方式。前端渲染主要借助Jupyter Notebook、和JupyterLab。下面,我们以Jupyter Notebook、Altair Viewer和*.py文件为例讲解展示方法。
1. Jupyter Notebook
在Jupyter Notebook中,Altair运行效果最理想,而且可以交互式地获得可视化渲染效果,如图2.35所示。

图2.35
2. Altair Viewer
在Notebook的环境中,使用Altair Viewer包的函数display()展示图形。生成的图形是一个具有本地URL的页面,而且后续生成的图形也是相同URL的本地页面。可以使用pip安装Altair Viewer包。

注意:函数display()不适合在*.py文件中使用。具体使用方法和本地页面运行效果如图2.36所示。

图2.36
说明:这种生成图形的方法具有局部的作用。
使用关键字参数inline可以将图形内嵌在Notebook中,实现代码如下所示。

在兼容IPython终端的Notebook的环境中,Altair的Viewer包可以通过启动altair_viewer渲染器的方法加载和使用。实现代码如下所示。

生成的图形是一个具有URL的本地页面,实现与函数display()相同的作用。
说明:这种生成图形的方法具有全局的作用。
使用关键字参数inline可以将图形内嵌在Notebook中,实现代码如下所示。

在*.py文件中,使用如下代码可以实现与函数show()相同的作用。

在non-Notebook的环境中,例如,在*.py文件中,可以使用Altair Viewer包的函数show()展示图形,实现代码如下所示。

执行这段代码,可以在具有URL的本地页面(例如,http://localhost:19567/)查看渲染效果,如图2.37所示。

图2.37
2.3.4 Altair的存储方法
在Altalir中,除了可以展示图形,还可以存储图形对象,存储图形对象的文件格式有HTML、JSON、PNG、SVG和PDF。存储方法既可以使用实例方法save(),也可以通过Web浏览器将展示的图形页面保存。
(1)使用实例方法save(),将图形对象保存为HTML文件,保存的文件格式是HTML。

使用实例方法Chart.save()保存文件的路径可以修改成需要的路径位置。生成的HTML页面可以使用浏览器打开完成图形渲染。
(2)使用实例方法save(),将图形对象保存为JSON文件,保存的文件格式是JSON。

在Altair中,生成的图形内容是一个JSON字符串,使用实例方法Chart.to_json()可以得到一个表示图形内容的JSON字符串。同时,可以将chart.json内容嵌入Web页面中。以chart.html文件为例,变量spec存储的内容就是chart.json文件的内容,也就是JSON字符串,如图2.38所示。

图2.38
(3)使用Web浏览器将图形对象保存为图片文件。
在Altair中,可以使用生成图形对象的Web页面将图形对象保存为图片文件,如图2.39所示。

图2.39
在图2.39中,点击图形右上角的…按钮,可以看到一个下拉界面,将图形对象保存为SVG和PNG图片。也可以在Web浏览器中查看JSON字符串,通过修改相关参数值和数值等方式交互式地查看可视化效果,如图2.40所示。

图2.40