Altair 并排分组条形图而不是单个图表

altair grouped bar chart side-by-side instead of single chart

我尝试创建图表,但最终并排显示了两个图表。 如何获得单个图表,而不是像 altair 分组条形图中显示的图表 example

df = pd.DataFrame({
    'strike': [200,225,250,275,300,325,350,200,225,250,275,300,325,350],
    'opttype': ['ce','ce','ce','ce','ce','ce','ce','pe','pe','pe','pe','pe','pe','pe' ],
    'oi': [100,150,500,800,450,200,77,50,500,210,300,150,60,17]
    
})
c = alt.Chart(df).mark_bar().encode(
    x='strike:N',
    y='oi:Q',
    color='opttype:N',
    column='opttype:N'
)

输出

我尝试按照此 中指定的方式添加轴,但是我无法获得组合图。可能是我在这里遗漏了什么。

我还想知道官方文档示例在没有“轴”的情况下如何正确工作。

目前最好的方法是切换 xcolumn 编码,然后缩小每个面板的宽度:

c = alt.Chart(df).mark_bar().encode(
    x='opttype:N',
    y='oi:Q',
    color='opttype:N',
    column='strike:N'
).properties(width=50)

然后,如果您愿意,可以像链接示例中那样调整轴和航向标签。例如,您可以将 header 标签移动到底部,如下所示:

c = alt.Chart(df).mark_bar().encode(
    x=alt.X('opttype:N', axis=None),
    y='oi:Q',
    color='opttype:N',
    column=alt.Column('strike:N', header=alt.Header(orient='bottom'))
).properties(width=50)

诚然,这是一个不完美的解决方案。 Vega-Lite 正在添加 offset 编码,无需使用多列分面即可实现此目的,但目前尚不可用。

x 轴和颜色变量应该相同:

df = pd.DataFrame({
    'strike': [200,225,250,275,300,325,350,200,225,250,275,300,325,350],
    'opttype': ['ce','ce','ce','ce','ce','ce','ce','pe','pe','pe','pe','pe','pe','pe' ],
    'oi': [100,150,500,800,450,200,77,50,500,210,300,150,60,17]
})

alt.Chart(df).mark_bar().encode(
    x='opttype:N',
    y='oi:Q',
    color='opttype:N',
    column='strike:N'
)