(第二章)Python统计可视化的Altair的图形语法

建议配合目录,那不然看着蛮乱。

在这里讲一下我为什么喜欢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.

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值