有一次项目里需要做数据分析报告 老板要求图表要好看 还要能快速调整。我用matplotlib画了半天 光是调整坐标轴就折腾了两小时。
后来发现了Altair。
01
Altair基于Vega-Lite语法 这是个声明式的可视化框架。你只需要告诉它数据是什么 想要什么图 它就帮你搞定。
不用关心具体怎么画。
import altair as altimport pandas as pddata = pd.DataFrame({ 'x': ['A', 'B', 'C', 'D', 'E'], 'y': [28, 55, 43, 91, 81]})chart = alt.Chart(data).mark_bar().encode( x='x', y='y')chart.show()
就这么简单。
matplotlib要写十几行的东西 Altair几行就搞定了。关键是代码读起来就像在说话 "用这个数据 画个柱状图 x轴是x列 y轴是y列"。
02
Altair的核心思想是Grammar of Graphics。把图表拆解成几个基本元素 数据、标记、编码、变换等等。
像搭积木一样组合。
import numpy as npn = 100df = pd.DataFrame({ 'x': np.random.randn(n), 'y': np.random.randn(n), 'category': np.random.choice(['A', 'B', 'C'], n), 'size': np.random.randint(10, 100, n)})scatter = alt.Chart(df).mark_circle().encode( x='x:Q', y='y:Q', color='category:N', size='size:Q').interactive() scatter.show()
这里的:Q和:N是数据类型标记。Q是定量 N是名义 O是有序 T是时间。
很直观。
03
我在项目中最常用的是多图组合。Altair的语法让这变得特别简单。
# 时间序列数据dates = pd.date_range('2023-01-01', periods=365)ts_data = pd.DataFrame({ 'date': dates, 'value': np.cumsum(np.random.randn(365)) + 100, 'category': np.random.choice(['产品A', '产品B'], 365)})# 基础图表base = alt.Chart(ts_data).add_selection( alt.selection_interval(bind='scales') # 可缩放选择)# 线图line = base.mark_line().encode( x='date:T', y='value:Q', color='category:N')# 柱状图 按月汇总bars = base.mark_bar().encode( x='month(date):O', y='mean(value):Q', color='category:N').resolve_scale(y='independent')# 垂直组合combined = alt.vconcat(line, bars)combined.show()
一个图表 两个视角。还能联动缩放。
这在matplotlib里得写一大堆代码呢。
04
说到踩坑 Altair有个数据行数限制。默认5000行 超了就报错。
解决方法很简单:
alt.data_transformers.enable('json')alt.data_transformers.disable_max_rows()large_data = pd.DataFrame({ 'x': np.random.randn(50000), 'y': np.random.randn(50000)})sampled = large_data.sample(n=5000)chart = alt.Chart(sampled).mark_circle().encode(x='x', y='y')
还有个小技巧 Altair支持数据变换。可以直接在图表定义里做统计。
sales_chart = alt.Chart(sales_data).mark_bar().encode( x='month(date):O', y='sum(amount):Q' ).transform_filter( alt.datum.date > '2023-01-01' )
不用提前处理数据 图表定义里就能搞定。
05
Altair最大的优势是表达力强 代码简洁。特别适合做数据探索和原型开发。
但也有限制 复杂的自定义图表还是matplotlib更灵活。性能上 大数据集处理matplotlib会更快一些。
我现在的习惯是 快速分析用Altair 生产环境的复杂图表用matplotlib。两个工具配合使用 效率高很多。
记住一点 Altair不是要替代matplotlib 而是在特定场景下提供更好的选择。声明式的思维方式 让我们把注意力放在数据和洞察上 而不是画图的技术细节。
这才是可视化的本质呢。