在多面 Altair 图表中重复轴

eja*_*ain 3 python altair

给定一个简单的多面图表,例如:

import altair as alt

data = alt.Data(values = [
    { "category" : "a", "x" : 1, "y" : 2 },
    { "category" : "a", "x" : 2, "y" : 4 },
    { "category" : "b", "x" : 1, "y" : 3 },
    { "category" : "b", "x" : 2, "y" : 5 }
])

alt.Chart(data).mark_point().encode(x = "x:Q", y = "y:Q").facet(
    row = "category:O"
)
Run Code Online (Sandbox Code Playgroud)

如何让 x 轴出现在每个子图上,而不是只出现在底部一次?这是为了提高子图很多时的可读性......

图表

jak*_*vdp 5

不幸的是,使用行编码时无法使 x 轴出现在多个图表中。作为解决方法,您可以根据筛选的数据手动 vconcat 图表:

chart = alt.Chart(data).mark_point().encode(x="x:Q", y="y:Q")

alt.vconcat(
    chart.transform_filter(alt.datum.category == 'a'),
    chart.transform_filter(alt.datum.category == 'b')
)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

为了避免手动写出列值,您可以使用 Python 工具生成不同的子图;例如,这相当于上面的:

df = pd.DataFrame.from_records([
    { "category" : "a", "x" : 1, "y" : 2 },
    { "category" : "a", "x" : 2, "y" : 4 },
    { "category" : "b", "x" : 1, "y" : 3 },
    { "category" : "b", "x" : 2, "y" : 5 }
])

chart = alt.Chart(df).mark_point().encode(x="x:Q", y="y:Q")

alt.vconcat(
    *(chart.transform_filter(alt.datum.category == val)
      for val in df['category'].unique())
)
Run Code Online (Sandbox Code Playgroud)