You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

x轴为时间类型时,如何让xOffset在Altair多柱条形图中生效?

问题:如何让xOffset在时间类型x轴(x="Date:T")下正常工作?

示例代码

import altair as alt
import polars as pl

source = pl.DataFrame(
    {
        "Category": list("AAABBBCCC"),
        "Value": [0.1, 0.6, 0.9, 0.7, 0.2, 1.1, 0.6, 0.1, 0.2],
        "Date": [f"2024-{m+1}-1" for m in range(3)] * 3,
    }
).with_columns(pl.col("Date").str.to_date())

bars = alt.Chart(source).mark_bar().encode(
    x=alt.X("Date:T"),
    xOffset="Category:N",
    y="Value:Q",
    color="Category:N",
)

bars

当前问题

  • 使用上述代码时,xOffset无法正常实现同日期内的类别分组偏移效果。
  • 若将x轴改为x="Date:N",虽能得到预期分组,但会丢失时间轴的自动格式化优势。

解决方案

可以通过给时间类型x轴指定离散时间单位,既保留时间轴的格式化特性,又让xOffset正常工作。修改x轴编码如下:

x=alt.X("Date:T", timeUnit="yearmonthday"),

完整修改后的代码:

import altair as alt
import polars as pl

source = pl.DataFrame(
    {
        "Category": list("AAABBBCCC"),
        "Value": [0.1, 0.6, 0.9, 0.7, 0.2, 1.1, 0.6, 0.1, 0.2],
        "Date": [f"2024-{m+1}-1" for m in range(3)] * 3,
    }
).with_columns(pl.col("Date").str.to_date())

bars = alt.Chart(source).mark_bar().encode(
    x=alt.X("Date:T", timeUnit="yearmonthday"),  # 指定离散时间单位
    xOffset="Category:N",
    y="Value:Q",
    color="Category:N",
)

bars

原理说明

  • timeUnit="yearmonthday" 将连续时间轴转换为离散的日期分组,让xOffset可以针对每个日期内的类别进行偏移。
  • x轴仍保持时间类型,因此会自动应用时间格式的轴标签,不会丢失格式化优势。
  • 可根据数据时间粒度选择其他时间单位,比如month、yearmonth等,适配不同维度需求。

内容的提问来源于stack exchange,提问作者bzm3r

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 02:37:24