如果使用 Altair 绘制分面图表,并且在尝试垂直组合图表时遇到错误消息,请确认每个图表具有相同的图表规范。
以下是一个示例,其中使用facet()方法创建一个垂直可组合的分面条形图。在这个例子中,每个图表都具有相同的x、y和facet规范。
import altair as alt
from vega_datasets import data
source = data.barley()
base = alt.Chart(source).encode(
alt.X('sum(yield):Q', axis=alt.Axis(title='Barley Yield (bushels/acre)')),
alt.Y('variety:O', axis=alt.Axis(title=None, ticks=False, labels=False)),
)
bar = base.mark_bar().encode(
alt.Color('year:N', legend=None),
)
text = base.mark_text(
align='left',
baseline='middle',
dx=3 # Nudges text to right so it doesn't appear on top of the bar
).encode(
text=alt.Text('sum(yield):Q', format='.1f')
)
(bar + text).facet(
column='site:N',
spacing={'row': 0, 'column': 20}
).properties(
title='Barley Yields by Variety and Site',
height=alt.Step(12) # controls width of horizontal bars
)
如果您的图表规范不相同,则可以使用 facet_data() 方法将它们转换为相同的规范。例如:
import pandas as pd
import altair as alt
from vega_datasets import data
source = data.barley()
# Define some helper functions
def pd_dict(x):
return pd.Series(x).to_dict()
def ungroup_facet_data(data):
facet = data['facet'].apply(pd_dict).apply(pd.Series)
return pd.concat([facet, data.drop(columns='facet')], axis='columns')
# Define data sources for each chart
source1 = source.groupby(['year', 'variety']).mean().reset_index()
source2 = source.groupby(['year', 'site']).mean().reset_index()
# Create each chart independently
bar = alt.Chart(source1).mark_bar().encode(
x='sum(yield):Q',
y=alt.Y('variety:N', title=None, axis=alt.Axis(labels=False, ticks=False, minExtent=30, domain=False)),
color=alt.Color('year:N', title=None),
).facet(column=alt.Column('year:N'))
lines = alt.Chart(source2).mark_line(point=True, size=2).encode(
x='year:N',
y='sum(yield):Q',
color=alt.Color('site:N', title=None),
).facet(column=alt.Column('variety:N'))
# Use facet_data on each chart's dataset
bar_data = bar.facet_data()
bar_data = ungroup_facet_data(bar_data)
line_data = lines.facet_data()
line_data = ungroup_facet_data(line_data)
# Recreate each chart, using the