在当今数据驱动的时代,高效、优雅地进行数据可视化已成为数据分析不可或缺的一环。Python 提供了多种可视化工具,如 Matplotlib、Seaborn、Plotly 和 Bokeh。而 Altair 以其独特的设计理念脱颖而出——它是一个基于“图形语法”(The Grammar of Graphics) 的声明式可视化库,专为简洁性、表达力和交互性而设计。

通过 Altair,你只需用几行代码描述“想画什么”,而不是“如何画”,即可生成美观且高度交互的图表。它特别适合探索性数据分析(EDA)、快速原型开发以及与 Jupyter Notebook 深度集成的场景。

本文将带你系统掌握 Altair 的核心概念、安装方法、基本语法、常用图表类型及高级功能,并展示其在真实项目中的实际应用。


一、什么是 Altair?

Altair 是一个基于 Vega 和 Vega-Lite 的 Python 数据可视化库,由 University of Washington 的交互数据实验室(Interactive Data Lab)开发。它的设计哲学深受 Leland Wilkinson 的《The Grammar of Graphics》影响,主张将图表分解为可组合的组件:数据、编码、标记、变换等。

核心特点:

特性 说明
声明式语法 你告诉 Altair “要做什么”,而不是“怎么做”
极简代码 多数图表仅需一行链式调用完成
自动美化 默认样式现代、专业,无需额外美化
原生支持交互 缩放、悬停、筛选、联动等交互功能开箱即用
与 Pandas 完美集成 直接使用 DataFrame 作为输入
输出为 JSON + HTML 图表可嵌入网页或导出为独立文件

💡 简单来说:Altair 让你用最少的代码,做出最专业的交互式图表。


二、安装与导入

使用 pip 安装 Altair:

pip install altair vega_datasets
  • altair:主库;
  • vega_datasets:提供内置示例数据集(可选但推荐)。

安装完成后,在 Python 脚本或 Jupyter Notebook 中导入:

import altair as alt
import pandas as pd
import numpy as np

# 可选:加载一些内置数据集用于练习
from vega_datasets import data

 

⚠️ 注意:Altair 图表依赖浏览器渲染,因此必须在支持 HTML 输出的环境中运行,如:

  • Jupyter Notebook / JupyterLab
  • Google Colab
  • Streamlit / Panel 应用

三、核心概念:“图形语法”四要素

Altair 的图表构建遵循四个基本组成部分:

  1. 数据(Data):通常是 Pandas DataFrame。
  2. 标记(Mark):表示数据点的图形元素,如点、线、条、面积等。
  3. 编码(Encoding):定义数据字段如何映射到视觉通道(如 x 轴、y 轴、颜色、大小、形状等)。
  4. 变换(Transformations):对数据进行过滤、聚合、计算新字段等操作(可在前端完成)。

这四个部分共同构成一个完整的可视化表达。


四、第一个 Altair 图表:鸢尾花散点图

我们以经典的 iris 数据集为例:

# 加载数据
iris = data.iris()

# 创建散点图
chart = alt.Chart(iris).mark_circle().encode(
    x='sepalLength',
    y='petalLength',
    color='species'
)

chart.show()

 

🎉 仅用三行代码,你就得到了一个带颜色区分、支持悬停提示、可缩放的交互式散点图!

解析代码结构:

  • alt.Chart(iris):指定数据源;
  • .mark_circle():使用圆形作为标记;
  • .encode(...):将字段映射到视觉属性;
  • .show():显示图表(Jupyter 中可省略,直接输出)。

五、常用图表类型实战

1. 折线图(Line Chart)

适用于时间序列趋势分析。

stocks = data.stocks()
line_chart = alt.Chart(stocks).mark_line().encode(
    x='date:T',           # T 表示时间类型
    y='price:Q',          # Q 表示定量变量
    color='symbol:N'      # N 表示类别型变量
).properties(
    title="股票价格走势"
)
line_chart

 

支持自动图例、悬停查看数值、按图例筛选系列。


2. 条形图(Bar Chart)

比较不同类别的数值。

bar_chart = alt.Chart(data.barley()).mark_bar().encode(
    x='sum(yield):Q',
    y='variety:O',        # O 表示有序类别
    color='site:N'
).properties(
    title="大麦产量按品种和地点汇总"
)
bar_chart

 

使用 sum() 进行聚合统计,支持堆叠显示。


3. 直方图(Histogram)

展示数值分布。

histogram = alt.Chart(iris).mark_bar().encode(
    alt.X('sepalWidth:Q', bin=alt.Bin(maxbins=30)),  # 自动分箱
    y='count()',                                    # 计数
    tooltip=['count()']
).properties(
    title="萼片宽度分布直方图"
)
histogram

 

bin=True 或设置 maxbins 控制分组数量。


4. 箱线图(Box Plot)

分析数据分布与异常值。

boxplot = alt.Chart(iris).mark_boxplot().encode(
    x='species:N',
    y='sepalLength:Q'
).properties(
    title="各物种萼片长度分布"
)
boxplot

 

自动生成中位数、四分位距、离群点。


5. 饼图与圆环图(Pie & Donut Chart)

显示比例关系(Altair 不直接支持 pie,但可通过角度实现):

source = data.population.url

pie_chart = alt.Chart(source).transform_filter(
    alt.datum.year == 2000
).transform_aggregate(
    total='sum(pop)',
    groupby=['sex']
).transform_calculate(
    angle=alt.datum.total / alt.expr.sum('total') * 2 * np.pi
).mark_arc(outerRadius=100).encode(
    theta=alt.Theta(field="total", type="quantitative"),
    color=alt.Color(field="sex", type="nominal", legend=None),
    tooltip=['sex', 'total']
).properties(
    title="2000年全球人口性别比例"
)

text = pie_chart.mark_text(radius=70, fill="white").encode(
    text=alt.Text(field="sex", type="nominal")
)

(pie_chart + text).configure_title(anchor='middle')

 

使用 mark_arc() 实现饼图,结合 text 添加标签。


6. 热力图(Heatmap)

展示二维矩阵相关性或频率。

heatmap = alt.Chart(data.cars()).mark_rect().encode(
    x='Cylinders:O',
    y='Origin:N',
    color='count():Q',
    tooltip=['Origin', 'Cylinders', 'count()']
).properties(
    title="汽车气缸数与产地分布热力图"
)
heatmap

 

mark_rect() 绘制矩形块,颜色深浅表示频次。


7. 地理空间图(Map Charts)

Altair 本身不支持地图投影,但可通过 Vega-Lite 接入 GeoJSON 实现简单地图可视化(建议结合 Folium 或 Plotly 用于复杂地理需求)。


六、增强交互性:无需代码的交互功能

Altair 最令人惊艳的是其零成本交互能力。许多交互功能只需添加一行配置即可启用。

1. 悬停提示(Tooltips)

alt.Chart(iris).mark_circle(size=60).encode(
    x='sepalLength',
    y='petalLength',
    color='species',
    tooltip=['species', 'sepalLength', 'petalLength']
)

 

鼠标悬停时自动显示信息。


2. 选择器(Selections)实现动态交互

(1)单击高亮某条折线

select_species = alt.selection_single(fields=['species'])

chart = alt.Chart(iris).mark_circle().encode(
    x='sepalLength',
    y='petalLength',
    color=alt.condition(select_species, 'species:N', alt.value('lightgray')),
    size=alt.Size('count()', legend=None)
).add_selection(
    select_species
)
chart

 

点击图例或数据点,只显示该类别的数据。


(2)区域选择(Interval Selection)

brush = alt.selection_interval()

points = alt.Chart(iris).mark_point().encode(
    x='sepalLength',
    y='petalLength',
    color=alt.condition(brush, 'species:N', alt.value('lightgray'))
).add_selection(brush)

bars = alt.Chart(iris).mark_bar().encode(
    y='species:N',
    color='species:N',
    x='count()'
).transform_filter(brush)

points & bars  # 垂直排列,联动更新

 

在上方散点图中框选区域,下方柱状图自动更新为选中数据的统计。


七、布局与组合图表

使用 |(并列)、&(叠加)、+(层叠)组合多个图表。

# 并列显示两个图表
(chart1 | chart2)  # 左右排列

# 垂直堆叠
(chart1 & chart2)  # 上下排列

# 图层叠加(如折线+点)
line + point

 

支持创建复杂的仪表板式布局。


八、数据转换(Data Transformations)

Altair 支持在图表内部进行数据处理,所有计算在前端(JavaScript)完成,提升性能。

常见变换:

alt.Chart(df).transform_filter(
    alt.datum.value > 100
).transform_aggregate(
    avg_price='mean(price)',
    groupby=['category']
).transform_calculate(
    profit='datum.revenue - datum.cost'
).encode(...)

 

类似于 Pandas 操作,但更轻量,适合 Web 渲染。


九、保存与导出图表

1. 保存为 HTML 文件

chart.save('my_chart.html')

 

包含完整交互功能,可在浏览器中打开。

2. 导出为 PNG/SVG

需要安装额外依赖:

pip install altair_saver selenium webdriver-manager

然后导出:

chart.save('chart.png')

 

支持 PNG、SVG、PDF 等格式。


十、Altair vs 其他可视化库对比

特性 Altair Matplotlib Seaborn Plotly Bokeh
声明式语法 ⭐⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐
交互性 ⭐⭐⭐⭐⭐ ⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐
学习曲线 简单 中等 简单 中等 较陡
默认美观度 极高 一般
Web 部署能力
大数据性能 中等 中等 中等 ⭐⭐⭐⭐⭐(WebGL)
适合场景 快速 EDA、教学、报告 出版级静态图 统计图表快速分析 交互报告、Dashboards 实时监控、复杂 Web 应用

💡 总结:

  • 若追求简洁、优雅、交互性强的快速可视化Altair 是首选之一
  • 若需构建大型 Web 应用,可结合 Panel 或 Streamlit 使用。

十一、最佳实践建议

  1. 优先使用 vega_datasets 或 Pandas DataFrame
  2. 明确字段类型(:Q:N:O:T),避免自动推断错误;
  3. 合理使用 selection 实现图表联动;
  4. 利用 properties(title=..., width=..., height=...) 控制外观;
  5. 在团队协作中分享 .html 文件,确保交互功能完整保留。

十二、总结

Altair 重新定义了 Python 数据可视化的效率与美感。它通过“图形语法”理念,将复杂的绘图过程简化为清晰的数据映射表达。无论是数据分析新手还是资深工程师,都能从中受益:

  • 新手:无需记忆复杂 API,快速上手;
  • 老手:用极少代码构建高度交互的可视化作品;
  • 团队:生成可共享、可复现的交互式报告。

通过本文的学习,你应该已经掌握了:

  • 如何安装和使用 Altair;
  • 图表的四大构成要素;
  • 常见图表类型的绘制方法;
  • 如何添加交互功能(悬停、选择、联动);
  • 如何保存和分享图表;
  • Altair 在生态系统中的定位与优势。

参考资料

 

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐