是否可以在Altair中包含多个数据源的分层图表?

时间:2019-12-09 20:24:09

标签: python altair

我的问题与here相似,但是我无法弄清楚如何正确指定数据。

我正在尝试创建带有刻面的分层条形图和刻度图。您无法对多面图表进行分层,因此我必须在父分层图表中指定数据和分面。按照所链接问题的示例,我添加了第二个数据集用于分层,同时还保留了构面:

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',
)

chart with too many ticks

我的问题是我也希望刻上多个刻度线。不合并数据集就可以吗?

例如,此解决方案的工作原理是先将数据合并在一起,但同时还会在彼此之间绘制多个刻度:

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',
)

1 个答案:

答案 0 :(得分:2)

您只能按单个数据集进行构面。我会通过将输入合并到单个数据框中并从那里构建图表来实现您想要的操作。例如:

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',
)

enter image description here