建议配合目录,那不然看着蛮乱。
在这里讲一下我为什么喜欢Altair而不是那么喜欢matplotlib,是有一次帮人做数据可视化的图,但是用的是韩语,换了很多种字体都无法显示韩语,一怒之下就换了Altair,好像印象是因为Altair是基于网页?我忘了,反正帮了我大忙TAT....
2.1 Altair图形系统的组成模块
Altair的图形系统由画布模块、线框模块、刻度模块、元素模块和装饰模块组成。
(1)线框模块。主要是由子区、图形框、图形框的填充颜色等组成,线框的载体是画布。
子区:图形区域中的小的图形区域。(如三个图中的其中一个为子图)
图形框:图形区域的边界框
图形框的填充颜色:填充图形区域以内的全部范围的颜色。(比如现在我指的地方是白色)
(2)刻度模块。由刻度线、刻度标签、轴脊和坐标轴等要素构成。
轴脊:刻度线和刻度标签的载体。
刻度线:轴脊上的类似标尺的标注数值位置的竖线。
刻度标签:描述等距竖线的距离的文本内容。
坐标轴:包括轴脊、刻度线和刻度标签。
量尺:设置坐标轴的映射关系。
坐标系:在直角坐标系下,通过有序实数对(x,y)描述点的位置。轴脊是与图形框互相重合的,因此,图形区域中有四条轴脊,分别是上轴脊、下轴脊、左轴脊和右轴脊。
(3)元素模块。主要是由图形区域中的几何形状要素构成。比如柱状图的柱子、气泡图中的圆形、折线图的折线。这些主要是起到视觉效果的作用。
(4)装饰模块。主要是图形区域中除线框、刻度和元素以外的要素。主要包括网格线、定位线、图形框标题、坐标轴标题、文本注释和图例等。
网格线:连接图形框的上下边界和左右边界的横纵交叉的直线
定位线:显示特定数值的线段(这个你们自己想象了,就是只要特定数值的线段)
图形框标题:标记图形区域的文本内容
坐标轴标题:标记x轴和y轴的文本内容
文本注释:精准标注图形区域中的线框要素、刻度要素、和元素要素的文本内容
图例:标记不同元素的文本内容
2.2 声明式统计可视化的意义和优势。
对比起Matplotlib、Plotly、Bokenh等比较来看,Altair好的一点在声明式统计可视化。声明式即描述、陈述和交互的过程,让我们更好的理解数据而不是放在复杂的视觉效果上。
(1)先写代码结构!
把东西往里面套就行了。(看注释!!!!)
import altair as alt
import pandas as pd
from vega_datasets import data
df=pd.read_json(data.cars.filepath)
chart=alt.Chart(df)
chart=alt.Chart(df).mark_point().encode(x="Horsepower:Q",y="Acceleration:Q") #前面不是说了吗,alt.Chart就是加载数据集,mark_*()是编码数据的标记样式,比如柱状图,直线图之类的,encode()就是设定映射数据的编码通道,即指定了要什么样的数据,数据的样式咋样
chart
2.3 Altair的语法规则
2.3.1 Altair的数据结构
在Altair中,使用的数据结构主要是Pandas中的DataFrame,因为DataFrame是一种类似Excel表格形式的数据结构,是一种整洁格式的二维表格,这也是统计可视化的特点之一,通过分类汇总和排列等统计技术,形成可读程度很高的表格。Altair提供的数据集和外部文件一般都可以通过Pandas的API函数以DataFrame的数据格式被加载。除了DataFrame,Altair还可以接受一下的几种数据结构。
(1)对象Data,比如
alt.Data(values=[{"a":"D","b":3},{"a":"B","b":"6"},{"a":"A","b":5}])
(2)用属性url指向JSON或者CSV格式的文本文件,例如,Altair的cars数据集,用data.cars.url方法即可加载JSON或者CSV格式的文本文件。
在使用实例方法encode()的过程中,经常可以看到“Q”,“N”,“O”,“T”,这是变量类型的缩写样式,这也是Altair比较特别的地方,它可以通过去了解绘制图形使用的变量类型而去描绘图形,也更好的认识数据、理解数据和探索数据。
变量类型 | 描述 | 缩写 | 示例 |
名义型变量 | 定类数据(nominal),表示样本个体的属性分类或者类别分类,呈现出离散无序的状态 | N | 简单的可以理解为名词型变量,就是一个word,比如车的分类可以有本田、大众、特斯拉等等,饭堂的饭有鸡腿饭、烧鸭饭等 |
次序型变量 | 定序数据,表示样本个体在有序状态中的相对位置,还可以分正向数据类型和反向数据类型,呈现出离散有序的状态 | O | 比如淘宝评价可以有五颗星,问卷调查可以有“非常满意”,“比较满意”“一般”“比较不满意”“非常不满意”,如果把这五个选项分别量化为1、2、3、4、5,那么这就是一个正向数据类型,否则为反向数据 |
数量型变量 | 数值数据(quantitative)可以分为离散数据和连续数据 | Q | 离散数据有间断特征,相邻数值之间不可以继续划分,比如,页面访问次数、单位时间内的车辆通过量。连续数据具有不间断的特征,也就是说,相邻数值之间可以无限划分,比如,地铁票价、智能手机的充电时间 |
时间型变量 | 时间序列数据(temporal)可以分为日期时间数据(datetime)、日期数据(date)和时间数据(time) | T | 日期数据主要由年月日三个时间维度组成,比如2024/6/29,日期数据页包括一年的12个月份、一周的7天。 时间数据就是小时分秒这三个组成,比如19:35:58。 日期时间数据就是日期数据和时间数据的组合,比如2024/6/29-19:35:58。 |
如果变量取值为字符串,则默认变量类型为名义型变量;
如果变量取值是数值,则默认变量类型为数量型变量;
如果变量取值为日期或时间,则变量类型默认设定为时间型变量;
名义型变量和次序型变量统称为离散型变量,时间型变量成为连续型变量;
如果数量型变量的取值是间断的离散数据,那么数量型变量则称为离散型变量;
如果数量型变量的取值为不间断的连续数据,那么数量型变量则称为连续型变量。
2.3.2 Altair的基本对象
在Altair中创建一个基本的图形,要用实用类alt.Chart(),返回值是基本对象Chart。使用类alt.Chart()可以绘制大部分的统计图形,可以通过alt.Chart()的关键字参数实现制定数据源和图形样式等需求。除了关键字参数data,类alt.Chart()还有一些关键字参数。如下:
关键字参数 | 功能 | 备注 |
data | 描述数据源 | 比如你的数据是xx.csv,你懂的 |
mark | 描述数据编码的形状 | 比如bar是柱状图,写为mark_bar() |
encoding | 描述变量的映射通道 | 使用变量名称和变量类型描述变量,比如encode(x="Horsepower:Q",y="Acceleration:Q"), |
background | 使用CSS颜色作为画布的背景颜色 | 可以用Hex颜色编码格式 |
title | 图形的标题 | |
padding | 画布边缘与图形框之间的距离 | |
transform | 数据的f分类、汇总和筛选等 | |
height | 画布的高度 | |
width | 画布的宽度 | |
config | 画布、图形区域等的属性配置 |
比如属性mark=实例方法mark_*(),属性encoding=实例方法encode()
一般的来说,使用基本对象Chart的实例方法mark*()描述数据编码的样式,样式包括形状(标记)、大小、方向、长度和颜色。使用实例方法encode()完成从数据列到可视化属性映射的过程,主要包括数据列的映射通道的设置,不同的映射通道上数据列的颜色、形状及位置的编码,提示信息的设置等。
类alt.Chart()通过关键字参数data接收数据源类型,也就是数据结构,类alt.Chart()通过关键字参数data接收数据源,关键字参数data的参数值可以是DataFrame、对象data和使用属性url指向的JSON/CSV格式下的文本文件。
//导入需要的包
import altair as alt
import pandas as pd
from vega_datasets import data
//分别定义三种数据结构,就是DataFrame,对象Data和文本文件
df1=pd.DataFrame({"a":["D","B","A"],"b":[3,6,5]})
df2=alt.Data(values=[{"a":"D","b":3},{"a":"B","b":6},{"a":"A","b":5}])
df3=data.cars.url
//将三种数据结构作为关键字参数data的参数值传入类alt.Chart(),返回对象Chart,用变量存储。
chart1=alt.Chart(df1)
chart2=alt.Chart(df2)
chart3=alt.Chart(df3)
chart1.mark_bar().encode(x="a:N",y="b:Q")
//由于df1,df2中含有名义型数据,用柱状图表示。
chart2.mark_bar(color="lightblue").encode(x="a:N",y="b:Q")
前面说了mark_*()是描述数据编码的形状,这里弄个color在里面是代表所有数据都用这个色
chart3.mark_point().encode(x="Horsepower:Q",y="Miles_per_Gallon:Q",color="Origin:N")
前面说了encode是描述变量的映射通道,这里的color映射了不同的“Origin”
做可视化的图要指定映射通道,也就是需要描述编码数据的位置,需要借助坐标系统的帮助,用x轴描述名义型变量的不同取值,用y轴描述数量型变量的具体取值。
也可以这样!使用键“x”表示x轴,使用键对应的值{"type":"nominal","field":"a"}描述映射在x轴上的变量名称和变量类型,其中,使用"field"表示变量名称,使用键"type"表示变量类型。
//其中一种形式,但是我不太喜欢
encodeChannel={"x":{"type":"nominal","field":"a"},
"y":{"type":"quantitative","field":"b"}}
alt.Chart(df1,mark="bar",encoding=encodeChannel)
也可以这么写!
chart1.mark_bar().encode(x="a:N",y="b:Q")
那么,我们怎么查到类alt.Chart()的关键字呢?
chart.encoding
//可查映射通道
chart.mark
//查形状
chart.width
//宽度
chart.height
//高度
也可以直接赋值。(这个图不对,应该是柱状图变宽变高了才是,,,)反正可以直接赋值!!
关键字参数 | 实例方法 |
mark="bar" | mark_bar() |
encoding={"x":{"type":"nominal","field":"a"},"y":{"type":"quantitative","field":"b"}} | encode(x="a:N",y="b:Q") |
两种都可以,我比较喜欢实例方法这种。
无论是用关键字参数还是实例方法,绘制图形的关键都是样式(mark)和映射通道(encoding),这也是图形语法的核心:将不同维度的数据按照映射通道(x轴和y轴)映射到坐标系统上,以位置、形状(标记)、大小、方向、长度和颜色等编码数据,实现从数据到视觉暗示的映射过程。
2.3.3 Altair的展示方法
1、一般用JupyterNotebook。比如这样
2、Altair Viewer
在Notebook的环境下,可以用Altair Viewer包的函数display()展示图形,生成的图形是一个具有本地URL的页面,而且后续生成的图形也是一样的URL的本地页面,安装如下:(去终端输入以下代码即可)
pip install altair_viewer
但是display()函数不适合在*.py文件中使用。(notebook的是*.ipynb)
我无法展示,反正就是可以在网页看图像,地址是localhost,以前可以用,现在不行了,不知道为什么。但是代码如下:
altair_viewer.display(chart)
用关键字参数inline可以将图形内嵌到Notebook中
import altair_viewer
altair_viewer.display(chart,inline=True)
在兼容IPython终端的Notebook的环境中,Altair的Viewer包可以通过启动altair_viewer渲染器的方法加载和使用
alt.renderers.enable("altair_viewer")
df=data.cars()
chart=alt.Chart(df).mark_point().encode(x="Acceleration:Q",y="Weight_in_lbs:Q")
chart
生成的图形是一个有URL的本地页面,实现与函数display()相同的作用。
alt.renderers.enable("altair_viewer",inline=True)
在*.py文件中,用如下代码可以实现与函数show()相同的作用。结尾用这个即可。
chart.show()
在不是Notebook的环境中,比如*.py文件中,可以用Altair Viewer包的函数show()展示图形
altair_viewer.show(chart)
2.3.4 Altair的存储方法
在Altair中,除了可以展示图形,还可以存储图形对象,存储图形对象的文件格式有HTML、JSON、PNG、SVG和PDF。存储方法既可以是实例方法save(),也可以通过Web浏览器将展示的图形页面保存。
(1)用实例方法save(),将图形对象保存为HTML文件,保存的文件格式是HTML
chart.save("d:/chart.html")
//注意了这个是保存的地址+文件名,比如我现在保存在d盘,文件名叫chart.html
//你也可以改成123.html,保存地址你喜欢,但是记得加斜杠,你懂得
(2)用实例方法save(),将图形对象保存为JSON文件,保存的文件格式是JSON
chart.save("d:/chart.json")
其他的比如png、svg都是一样的!!!!
(3) 用Web浏览器将图形对象保存为图片文件。
在Altair中,可以用生成图形对象的Web页面将图形对象保存为图片文件。
我无法展示,因为我浏览器那个弄不了,,,现在用notebook,但是notebook无法保存,有这样交互式的按钮,你们看着办。。。也可以在web浏览器中查看JSON字符串,通过修改相关参数值和数值等方式交互地看可视化效果。
参考文献
刘大成. Python统计可视化之Altair探索分析实践指南,2022.