是否可以在 Altair 中对具有多个数据源的分层图表进行分面?
Is it possible to facet a layered chart with multiple data sources in Altair?
我的问题与 相似,但我不知道如何正确指定数据。
我正在尝试创建带有分面的分层条形图和刻度图。您不能对多面图表进行分层,因此我必须在父分层图表中指定数据和分面。按照链接问题中的示例,我添加了第二个数据集用于分层,同时还保留了小平面:
bars = pd.DataFrame({
'year': np.repeat([2018, 2019], 6),
'cat1': np.tile(['a', 'a', 'a', 'b', 'b', 'b'], 2),
'cat2': np.tile(list('XYZ'), 4),
'vals': np.arange(1, 13)
})
ticks = pd.DataFrame({
'year': np.repeat([2018, 2019], 2),
'cat1': np.tile(['a', 'b'], 2),
'limit': [8, 13, 25, 32]
})
b = alt.Chart().mark_bar().encode(
x='year:O',
y='vals',
color='cat2',
).properties(width=100)
t = alt.Chart(ticks).mark_tick(color='black', thickness=2, width=40).encode(
x='year:O',
y='limit',
)
alt.layer(b, t, data=bars).facet(
'cat1:N',
)
我的问题是我希望刻度线也被刻面。如果不合并数据集,这可能吗?
例如,此解决方案首先将数据合并在一起,但它也会在彼此之上绘制多个刻度:
bars_and_ticks = bars.merge(ticks, on=['year', 'cat1'])
t = alt.Chart().mark_tick(color='black', thickness=2, width=40).encode(
x='year:O',
y='limit',
)
alt.layer(b, t, data=bars_and_ticks).facet(
'cat1:N',
)
您只能按单个数据集进行分面。我会通过将您的输入组合到一个数据框中并从那里构建图表来处理您想要做的事情。例如:
import pandas as pd
import numpy as np
import altair as alt
bars = pd.DataFrame({
'year': np.repeat([2018, 2019], 6),
'cat1': np.tile(['a', 'a', 'a', 'b', 'b', 'b'], 2),
'cat2': np.tile(list('XYZ'), 4),
'vals': np.arange(1, 13)
})
ticks = pd.DataFrame({
'year': np.repeat([2018, 2019], 2),
'cat1': np.tile(['a', 'b'], 2),
'limit': [8, 13, 25, 32]
})
data = pd.merge(bars, ticks, how='left', on=['year', 'cat1'])
b = alt.Chart(data).mark_bar().encode(
x='year:O',
y='vals',
color='cat2',
).properties(width=100)
t = alt.Chart(data).mark_tick(color='black', thickness=2, width=40).encode(
x='year:O',
y='max(limit):Q',
)
alt.layer(b, t).facet(
'cat1:N',
)
我的问题与
我正在尝试创建带有分面的分层条形图和刻度图。您不能对多面图表进行分层,因此我必须在父分层图表中指定数据和分面。按照链接问题中的示例,我添加了第二个数据集用于分层,同时还保留了小平面:
bars = pd.DataFrame({
'year': np.repeat([2018, 2019], 6),
'cat1': np.tile(['a', 'a', 'a', 'b', 'b', 'b'], 2),
'cat2': np.tile(list('XYZ'), 4),
'vals': np.arange(1, 13)
})
ticks = pd.DataFrame({
'year': np.repeat([2018, 2019], 2),
'cat1': np.tile(['a', 'b'], 2),
'limit': [8, 13, 25, 32]
})
b = alt.Chart().mark_bar().encode(
x='year:O',
y='vals',
color='cat2',
).properties(width=100)
t = alt.Chart(ticks).mark_tick(color='black', thickness=2, width=40).encode(
x='year:O',
y='limit',
)
alt.layer(b, t, data=bars).facet(
'cat1:N',
)
我的问题是我希望刻度线也被刻面。如果不合并数据集,这可能吗?
例如,此解决方案首先将数据合并在一起,但它也会在彼此之上绘制多个刻度:
bars_and_ticks = bars.merge(ticks, on=['year', 'cat1'])
t = alt.Chart().mark_tick(color='black', thickness=2, width=40).encode(
x='year:O',
y='limit',
)
alt.layer(b, t, data=bars_and_ticks).facet(
'cat1:N',
)
您只能按单个数据集进行分面。我会通过将您的输入组合到一个数据框中并从那里构建图表来处理您想要做的事情。例如:
import pandas as pd
import numpy as np
import altair as alt
bars = pd.DataFrame({
'year': np.repeat([2018, 2019], 6),
'cat1': np.tile(['a', 'a', 'a', 'b', 'b', 'b'], 2),
'cat2': np.tile(list('XYZ'), 4),
'vals': np.arange(1, 13)
})
ticks = pd.DataFrame({
'year': np.repeat([2018, 2019], 2),
'cat1': np.tile(['a', 'b'], 2),
'limit': [8, 13, 25, 32]
})
data = pd.merge(bars, ticks, how='left', on=['year', 'cat1'])
b = alt.Chart(data).mark_bar().encode(
x='year:O',
y='vals',
color='cat2',
).properties(width=100)
t = alt.Chart(data).mark_tick(color='black', thickness=2, width=40).encode(
x='year:O',
y='max(limit):Q',
)
alt.layer(b, t).facet(
'cat1:N',
)