Vega/Altair 复合图表全解析:从图层叠加到多视图布局
概述
在数据可视化领域,Vega/Altair 提供了一套强大的复合图表构建工具,让用户可以轻松创建包含多个视图的复杂可视化。本文将深入解析 Vega/Altair 中的五种核心复合图表类型:图层叠加、水平拼接、垂直拼接、重复图表和分面图表,帮助您掌握构建高级可视化的技巧。
复合图表类型速查表
Vega/Altair 提供了多种创建复合图表的方式,每种方式都有对应的类、函数形式和运算符形式:
| 类 | 函数形式 | 运算符形式 | 说明 | |-------------------|----------------------------|----------------|--------------| | LayerChart
| alt.layer(chart1, chart2)
| chart1 + chart2
| 图层叠加 | | HConcatChart
| alt.hconcat(chart1, chart2)
| chart1 | chart2
| 水平拼接 | | VConcatChart
| alt.vconcat(chart1, chart2)
| chart1 & chart2
| 垂直拼接 | | RepeatChart
| chart.repeat(row, column)
| - | 重复图表 | | FacetChart
| chart.facet(facet, row, column)
| - | 分面图表 |
图层叠加 (Layered Charts)
图层叠加允许您在相同的坐标系上叠加不同的图表,非常适合需要同时展示多种标记类型的场景。
基本用法
base = alt.Chart(stocks).encode(
x='date:T',
y='price:Q',
color='symbol:N'
).transform_filter(
alt.datum.symbol == 'GOOG'
)
# 运算符形式
combined = base.mark_line() + base.mark_point()
# 函数形式
combined = alt.layer(base.mark_line(), base.mark_point())
图层顺序的重要性
图层叠加时,后添加的图层会覆盖先添加的图层。例如在热力图上方添加点标记:
heatmap = alt.Chart(source).mark_rect().encode(...)
points = alt.Chart(source).mark_circle().encode(...)
# 正确的顺序:热力图在下,点在上
correct = heatmap + points
# 错误的顺序:点会被热力图遮挡
wrong = points + heatmap
水平拼接 (Horizontal Concatenation)
水平拼接适合并排展示相关图表,便于比较不同视角的数据。
典型应用场景
# 散点图
chart1 = alt.Chart(iris).mark_point().encode(
x='petalLength:Q',
y='petalWidth:Q'
)
# 直方图
chart2 = alt.Chart(iris).mark_bar().encode(
x='count()',
y=alt.Y('petalWidth:Q').bin()
)
# 拼接展示
combined = chart1 | chart2
# 或 alt.hconcat(chart1, chart2)
垂直拼接 (Vertical Concatenation)
垂直拼接常用于创建交互式的上下关联视图,如主图+细节图模式。
交互式示例
brush = alt.selection_interval(encodings=['x'])
base = alt.Chart(source).mark_area().encode(
x='date:T',
y='price:Q'
)
upper = base.encode(alt.X('date:T').scale(domain=brush))
lower = base.properties(height=60).add_params(brush)
combined = upper & lower
# 或 alt.vconcat(upper, lower)
重复图表 (Repeated Charts)
重复图表提供了一种高效创建多面板图表的方法,特别适合探索多维数据。
基本模式
alt.Chart(iris).mark_point().encode(
alt.X(alt.repeat("column"), type='quantitative'),
alt.Y(alt.repeat("row"), type='quantitative'),
color='species:N'
).repeat(
row=['petalLength', 'petalWidth'],
column=['sepalLength', 'sepalWidth']
)
图层重复
alt.Chart(source).mark_line().encode(
x=alt.X("IMDB_Rating").bin(),
y=alt.Y(alt.repeat('layer')).aggregate('mean'),
color=alt.ColorDatum(alt.repeat('layer'))
).repeat(layer=["US_Gross", "Worldwide_Gross"])
分面图表 (Faceted Charts)
分面图表(又称小多重图表)按照数据子集创建多个面板,是探索分类数据的强大工具。
基本分面
# 函数形式
alt.Chart(iris).mark_point().encode(
x='petalLength:Q',
y='petalWidth:Q'
).facet(
column='species:N'
)
# 编码形式
alt.Chart(iris).mark_point().encode(
x='petalLength:Q',
y='petalWidth:Q',
column='species:N'
)
复杂分面
hover = alt.selection_point(on='pointerover')
base = alt.Chart(iris).encode(
x='petalLength:Q',
y='petalWidth:Q',
color=alt.condition(hover, 'species:N', alt.value('lightgray'))
)
points = base.mark_point().add_params(hover)
text = base.mark_text(dy=-5).encode(
text='species:N',
opacity=alt.condition(hover, alt.value(1), alt.value(0))
)
alt.layer(points, text).facet('species:N')
选择指南
- 图层叠加:当需要在同一坐标系叠加不同标记时使用
- 水平/垂直拼接:适合展示完全独立的视图
- 重复图表:当多个面板只有编码不同时最有效
- 分面图表:按照数据子集创建面板时的最佳选择
掌握这些复合图表技术,您将能够创建出信息丰富、交互性强的专业级数据可视化作品。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考