Altair是一个基于Vega和Vega-Lite的Python可视化库,它 采用声明式语法来实现统计图的快速生成,从而帮助数据分析 人员快速洞察数据。在这个教程中,我们将通过9个小案例来 学习Altair可视化的一般步骤,包括安装、x/y轴的映射、数据 缩放等内容,相信有助于你快速了解并掌握Altair这一强大而 灵活的Python数据可视化工具。
机器学习相关教程:TensorFlow实战 | 机器学习基础 | 深入浅出Flask | Python基础
1、Altair可视化Python开发包简介
首先安装Altair可视化包和示例数据集:
pip install altair vega_datasets
然后引入altair和pandas:
import altair as alt
import pandas as pd
下面我们使用vega_data数据集中的gapminder数据来可视化 1995~2005年间全球部分国家的健康和人口数据。
from vega_datasets import data as vega_data
gap = pd.read_json(vega_data.gapminder.url)
gap.head(10)
数据看起来是这样:
我们先看看这里面包含哪几年的数据:
>>> gap.year.unique()
array([1955, 1960, 1965, 1970, 1975, 1980, 1985, 1990, 1995, 2000, 2005])
我们更关心最近的数据,所以看看2005年的:
gap2005 = gap.loc[gap['year'] == 2005]
2、altair可视化 —— 设置X轴和Y轴
我们关心生育能力和寿命预期之间的关系,因此我们使用altair的 make_poin()来显示数据点:
alt.Chart(gap2005).mark_point().encode(
alt.X('fertility'),
alt.Y('life_expect')
)
绘制的altair图形看起来是这样:
上图中数据没有显示在图的中间部分,在altair中,我们可以使用 scale方法来进行调整。
3、altair可视化 —— 调整数据缩放比例
下面的代码使用altair的scale方法调整数据缩放比例:
alt.Chart(gap2005).mark_point().encode(
alt.X('fertility', scale=alt.Scale(zero=False)),
alt.Y('life_expect', scale=alt.Scale(zero=False))
)
调整缩放比例后altair可视化结果如下:
不错!不过,如果我们希望看到与生育能力和预期寿命相关的人口数量 该怎么做?我们应该利用另一个维度:人口数量。
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绘制的结果如下图:
相当棒!右边的图标显示了不同大小的圆对应的人口数量。那么, 我们还可以在增加一个维度吗?当然,现在我们添加颜色!
4、altair可视化 —— 添加颜色维度
在下面的代码中,我们为atlair图添加颜色维度:
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中,我们可以指定数据的解释类型: N表示分类,Q表示数值,O表示排序,T表示时间点或间隔。在上面 的代码中,由于我希望将cluster数据解释为分类数据,因此使用:N来声明其类型。
为了让圆看起来更顺眼一些,我们使用filled=True对其上色, 并使用altair的OpacityValue设置了半透明。
5、Altair可视化 —— 显示每个点的信息
如果在一个Altair图表中有很多数据点,有没有办法在点击一个点的时候, 显示相关的国家、生育率、预期寿命等信息?当然!在Altair中,使用 Tooltip就可以实现这个功能。
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图!
6、Altair可视化 —— 选中单个点
selection_single()让我们可以为单个点添加可交互行为。当我们 点击一个点时,希望其他所有不相关的点都变成灰色,这可以通过 alt.condition()来实现。
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结果图如下:
7、Altair可视化 —— 选中多个点
前面我们实现了在Altair图上选中单个点的操作,不过我们对于 同时选中多个点更有兴趣。这可以利用altair的selection_multi() 来实现。
由于我们希望尝试不同的选择工具,因此先创建一个函数:
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图拼接在一起:
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)')
)
8、Altair可视化 —— 时间周期的利用
我们已经看到了2005年的数据。那么,如果希望看到数据随时间的变化该怎么做? 在Altair中这很简单,使用altair的selection_single并设置 name=’select’和fields = [‘year’], 以及初始年份init={‘year’: 1955} 和时间范围bind=alt.binding_range(min=1955, max=2005, step=5):
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可视化结果如下:
真不错!现在我们只要用鼠标拉动滑杆,就可以很清楚地看到数据随时间 的变化情况了!
9、Altair可视化 —— 保存图表
当我们辛辛苦苦用Altair实现了数据可视化之后,面临的最后一个问题, 就是如何保存下来生成的图,以便在我们的网站或社交媒体上分享。在Altair 中这很简单,只要点击图表右上角的按钮就可以了!
原文链接:http://blog.hubwiz.com/2020/04/06/altair-interactive-plot/