Altair可视化实战【从安装到交互】

Altair是一个基于Vega和Vega-Lite的Python可视化库,它 采用声明式语法来实现统计图的快速生成,从而帮助数据分析 人员快速洞察数据。在这个教程中,我们将通过9个小案例来 学习Altair可视化的一般步骤,包括安装、x/y轴的映射、数据 缩放等内容,相信有助于你快速了解并掌握Altair这一强大而 灵活的Python数据可视化工具。

机器学习相关教程:TensorFlow实战 | 机器学习基础 | 深入浅出Flask | Python基础

1、Altair可视化Python开发包简介

首先安装Altair可视化包和示例数据集:

1
pip install altair vega_datasets

然后引入altair和pandas:

1
2
import altair as alt
import pandas as pd

下面我们使用vega_data数据集中的gapminder数据来可视化 1995~2005年间全球部分国家的健康和人口数据。

1
2
3
4
from vega_datasets import data as vega_data
gap = pd.read_json(vega_data.gapminder.url)

gap.head(10)

数据看起来是这样:

altair可视化

我们先看看这里面包含哪几年的数据:

1
2
3
>>> gap.year.unique()

array([1955, 1960, 1965, 1970, 1975, 1980, 1985, 1990, 1995, 2000, 2005])

我们更关心最近的数据,所以看看2005年的:

1
gap2005 = gap.loc[gap['year'] == 2005]

2、altair可视化 —— 设置X轴和Y轴

我们关心生育能力和寿命预期之间的关系,因此我们使用altair的 make_poin()来显示数据点:

1
2
3
4
alt.Chart(gap2005).mark_point().encode(
alt.X('fertility'),
alt.Y('life_expect')
)

绘制的altair图形看起来是这样:

altair可视化

上图中数据没有显示在图的中间部分,在altair中,我们可以使用 scale方法来进行调整。

3、altair可视化 —— 调整数据缩放比例

下面的代码使用altair的scale方法调整数据缩放比例:

1
2
3
4
alt.Chart(gap2005).mark_point().encode(
alt.X('fertility', scale=alt.Scale(zero=False)),
alt.Y('life_expect', scale=alt.Scale(zero=False))
)

调整缩放比例后altair可视化结果如下:

altair可视化

不错!不过,如果我们希望看到与生育能力和预期寿命相关的人口数量 该怎么做?我们应该利用另一个维度:人口数量。

1
2
3
4
5
alt.Chart(gap2005).mark_point().encode(
alt.X('fertility', scale=alt.Scale(zero=False)),
alt.Y('life_expect', scale=alt.Scale(zero=False)),
alt.Size('pop')
)

altair绘制的结果如下图:

altair可视化

相当棒!右边的图标显示了不同大小的圆对应的人口数量。那么, 我们还可以在增加一个维度吗?当然,现在我们添加颜色!

4、altair可视化 —— 添加颜色维度

在下面的代码中,我们为atlair图添加颜色维度:

1
2
3
4
5
6
7
alt.Chart(gap2005).mark_point(filled=True).encode(
alt.X('fertility:Q', scale=alt.Scale(zero=False)),
alt.Y('life_expect:Q', scale=alt.Scale(zero=False)),
alt.Size('pop:Q'),
alt.Color('cluster:N'),
alt.OpacityValue(0.5)
)

altair的可视化结果如下:

altair可视化

正如你上面看到的,在Altair中,我们可以指定数据的解释类型: N表示分类,Q表示数值,O表示排序,T表示时间点或间隔。在上面 的代码中,由于我希望将cluster数据解释为分类数据,因此使用:N来声明其类型。

为了让圆看起来更顺眼一些,我们使用filled=True对其上色, 并使用altair的OpacityValue设置了半透明。

5、Altair可视化 —— 显示每个点的信息

如果在一个Altair图表中有很多数据点,有没有办法在点击一个点的时候, 显示相关的国家、生育率、预期寿命等信息?当然!在Altair中,使用 Tooltip就可以实现这个功能。

1
2
3
4
5
6
7
8
9
10
11
12
alt.Chart(gap2005).mark_point(filled=True).encode(
alt.X('fertility:Q', scale=alt.Scale(zero=False)),
alt.Y('life_expect:Q', scale=alt.Scale(zero=False)),
alt.Size('pop:Q'),
alt.Color('cluster:N'),
alt.OpacityValue(0.5),
alt.Order('pop:Q', sort='descending'),
tooltip = [alt.Tooltip('country:N'),
alt.Tooltip('fertility:Q'),
alt.Tooltip('life_expect:Q')
]
)

生成的Altair图如下所示:

altair可视化

能看到每个点对应的信息固然好,但是如果能同时查看多个数据点的 信息岂不是更好?好了不废话了,下面让我们看看如何创建可以交互 的Altair图!

6、Altair可视化 —— 选中单个点

selection_single()让我们可以为单个点添加可交互行为。当我们 点击一个点时,希望其他所有不相关的点都变成灰色,这可以通过 alt.condition()来实现。

1
2
3
4
5
6
7
8
9
10
11
12
selection = alt.selection_single();
alt.Chart(gap2005).mark_point(filled=True).encode(
alt.X('fertility:Q', scale=alt.Scale(zero=False)),
alt.Y('life_expect:Q', scale=alt.Scale(zero=False)),
alt.Size('pop:Q'),
alt.Order('pop:Q', sort='descending'),
tooltip = [alt.Tooltip('country:N'),
alt.Tooltip('fertility:Q'),
alt.Tooltip('life_expect:Q')
],
color=alt.condition(selection, 'cluster:N', alt.value('grey'))
).add_selection(selection)

得到的altair结果图如下:

altair可视化

7、Altair可视化 —— 选中多个点

前面我们实现了在Altair图上选中单个点的操作,不过我们对于 同时选中多个点更有兴趣。这可以利用altair的selection_multi() 来实现。

由于我们希望尝试不同的选择工具,因此先创建一个函数:

1
2
3
4
5
6
7
8
9
10
11
12
def plot(selection):
return alt.Chart(gap2005).mark_point(filled=True).encode(
alt.X('fertility:Q', scale=alt.Scale(zero=False)),
alt.Y('life_expect:Q', scale=alt.Scale(zero=False)),
alt.Size('pop:Q'),
alt.Order('pop:Q', sort='descending'),
tooltip = [alt.Tooltip('country:N'),
alt.Tooltip('fertility:Q'),
alt.Tooltip('life_expect:Q')
],
color=alt.condition(selection, 'cluster:N', alt.value('grey'))
).add_selection(selection)

现在使用alt.hconcat()来尝试不同的选择并将得到的altair图拼接在一起:

1
2
3
4
5
alt.hconcat(
plot(alt.selection_single()).properties(title='Single (Click)'),
plot(alt.selection_multi()).properties(title='Multi (Shift-Click)'),
plot(alt.selection_interval()).properties(title='Interval (Drag)')
)

altair可视化

8、Altair可视化 —— 时间周期的利用

我们已经看到了2005年的数据。那么,如果希望看到数据随时间的变化该怎么做? 在Altair中这很简单,使用altair的selection_single并设置 name=’select’和fields = [‘year’], 以及初始年份init={‘year’: 1955} 和时间范围bind=alt.binding_range(min=1955, max=2005, step=5):

1
2
3
4
5
6
7
8
9
10
11
12
select_year = alt.selection_single(
name='select', fields=['year'], init={'year': 1955},
bind=alt.binding_range(min=1955, max=2005, step=5)
)
alt.Chart(gap).mark_point(filled=True).encode(
alt.X('fertility', scale=alt.Scale(zero=False)),
alt.Y('life_expect', scale=alt.Scale(zero=False)),
alt.Size('pop:Q'),
alt.Color('cluster:N'),
alt.Order('pop:Q', sort='descending'),

).add_selection(select_year).transform_filter(select_year)

得到的altair可视化结果如下:

altair可视化

真不错!现在我们只要用鼠标拉动滑杆,就可以很清楚地看到数据随时间 的变化情况了!

9、Altair可视化 —— 保存图表

当我们辛辛苦苦用Altair实现了数据可视化之后,面临的最后一个问题, 就是如何保存下来生成的图,以便在我们的网站或社交媒体上分享。在Altair 中这很简单,只要点击图表右上角的按钮就可以了!

altair可视化


原文链接:How to Create Interactive Plots with Altair

汇智网翻译整理,转载请标明出处