您可以通过指定.repeat()
和变量列表row
来做到这一点。这比column
ggplot 更接近,但 API 非常优雅。(请参阅此处的讨论。)API 在这里facet_grid()
facet_wrap()
iris = data.iris()
alt.Chart(iris).mark_circle().encode(
alt.X(alt.repeat("column"), type='quantitative'),
alt.Y(alt.repeat("row"), type='quantitative'),
color='species:N'
).properties(
width=250,
height=250
).repeat(
row=['petalLength', 'petalWidth'],
column=['sepalLength', 'sepalWidth']
).interactive()
产生:
请注意,整个集合是串联交互的(放大、缩小)。
请务必查看文档中的RepeatedCharts和FacetedCharts。
创建facet_wrap()
绘图的样式网格
如果您想要一个接一个地布置图表的功能区(不一定将列或行映射到数据框中的变量),您可以通过将Altair 图表列表的组合包裹hconcat()
起来来做到这一点。vconcat()
我相信还有更优雅的方法,但我就是这样做的。
以下代码中使用的逻辑:
- 首先,创建一个
base
Altair 图表
- 用于
transform_filter()
将数据过滤到多个子图中
- 确定一行中的图数并将该列表切分
- 遍历列表列表,一次放置一行。
-
import altair as alt
from vega_datasets import data
from altair.expr import datum
iris = data.iris()
base = alt.Chart(iris).mark_point().encode(
x='petalLength:Q',
y='petalWidth:Q',
color='species:N'
).properties(
width=60,
height=60
)
#create a list of subplots
subplts = []
for pw in iris['petalWidth'].unique():
subplts.append(base.transform_filter(datum.petalWidth == pw))
def facet_wrap(subplts, plots_per_row):
rows = [subplts[i:i+plots_per_row] for i in range(0, len(subplts), plots_per_row)]
compound_chart = alt.hconcat()
for r in rows:
rowplot = alt.vconcat() #start a new row
for item in r:
rowplot |= item #add suplot to current row as a new column
compound_chart &= rowplot # add the entire row of plots as a new row
return compound_chart
compound_chart = facet_wrap(subplts, plots_per_row=6)
compound_chart
生产: