gpt4 book ai didi

python - 是否可以在 Altair 中使用多个数据源对分层图表进行分面?

转载 作者:行者123 更新时间:2023-12-02 05:34:15 29 4
gpt4 key购买 nike

我的问题类似于 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',
)

最佳答案

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

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

关于python - 是否可以在 Altair 中使用多个数据源对分层图表进行分面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59256058/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com