Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Altair中,是否有可能对具有多个数据源的分层图表进行刻面?_Python_Altair - Fatal编程技术网

Python 在Altair中,是否有可能对具有多个数据源的分层图表进行刻面?

Python 在Altair中,是否有可能对具有多个数据源的分层图表进行刻面?,python,altair,Python,Altair,我的问题与前面的问题类似,但是我不知道如何正确指定数据 我正在尝试创建一个带有刻面的分层条形图。您不能对刻面图表进行分层,因此我必须在父分层图表中指定数据和刻面。按照问题链接中的示例,我添加了第二个用于分层的数据集,同时还保留了方面: bars = pd.DataFrame({ 'year': np.repeat([2018, 2019], 6), 'cat1': np.tile(['a', 'a', 'a', 'b', 'b', 'b'], 2), 'cat2': np

我的问题与前面的问题类似,但是我不知道如何正确指定数据

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

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