【问题标题】:Repeating an axis in a faceted Altair chart在多面 Altair 图表中重复轴
【发布时间】:2020-03-04 15:44:24
【问题描述】:

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

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 轴出现,而不是只出现在底部一次?这是为了在有很多子图表时提高可读性...

【问题讨论】:

    标签: python altair


    【解决方案1】:

    很遗憾,在使用行编码时,无法让 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')
    )
    

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

    【讨论】:

    • 使用这种方法,有没有办法共享 y 轴刻度(没有根据最小值和最大值显式设置)?
    • 是的,使用解析方法:resolve_scale(y='shared')
    【解决方案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 轴范围,这也会将它们解耦!据我所知,没有简单的方法可以重复轴而不使各个方面独立。但您始终可以通过固定范围来实现这一目标。

    【讨论】:

      猜你喜欢
      • 2021-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-22
      相关资源
      最近更新 更多