在多面Altair图表中重复轴

时间:2018-11-07 00:31:01

标签: 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"
)

每个子图的x轴如何显示,而不是在底部仅显示一次?当子图很多时,这是为了提高可读性。

chart

2 个答案:

答案 0 :(得分:2)

不幸的是,使用行编码时,无法使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')
)

enter image description here

为避免手动写出列值,您可以使用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())
)

答案 1 :(得分:2)

这是重复轴的简单方法,但有一个缺点:

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"
).resolve_scale(x='independent')

但是:如果小平面的x轴范围不同,这也会使它们解耦!据我所知,没有简单的方法可以重复轴而不使面独立。但您始终可以确定范围以实现此目标。