强制 Altair 图表显示年份

问题描述 投票:0回答:1

使用自 2022 年 1 月 1 日起的日期和值数据框:

import datetime as dt
import altair as alt
import polars as pl
import numpy as np

alt.renderers.enable("browser")

dates = pl.date_range(dt.date(2022, 1, 1), dt.date(2025, 1, 22), "1d", eager = True)
values = np.random.uniform(size = len(dates))
df = pl.DataFrame({"dates": dates, "values": values})
alt.Chart(df).mark_point().encode(alt.X("dates:T"), alt.Y("values:Q")).show()

correct scatter plot with year dates

但是如果我从 2020 年开始数据框并筛选日期 > 2022 年 1 月 1 日:

dates_b = pl.date_range(dt.date(2020, 1, 1), dt.date(2025, 1, 22), "1d", eager = True)
values_b = np.random.uniform(size = len(dates_b))
df_b = pl.DataFrame({"dates": dates, "values": values})
alt.Chart(df_b.filter(pl.col("dates") > dt.date(2022, 1, 1))).mark_point().encode(alt.X("dates:T"), alt.Y("values:Q")).show()

incorrect scatter plot with missing years

如何指定必须显示年份?

请注意,如果我使用

>=
进行过滤以包含 2022 年 1 月 1 日,我确实会得到正确的结果,但这不是重点。我总是需要几年。

python python-polars altair
1个回答
0
投票

您可以使用

labelExpr
构建自己的逻辑来设置刻度标签。例如,如果月份是一月,则给出年份,否则给出月份。

dates_b = pl.date_range(dt.date(2020, 1, 1), dt.date(2025, 1, 22), "1d", eager=True)
values_b = np.random.uniform(size=len(dates_b))
df_b = pl.DataFrame({"dates": dates, "values": values})
alt.Chart(df_b.filter(pl.col("dates") > dt.date(2022, 1, 1))).mark_point().encode(
    alt.X("dates:T").axis(
        labelExpr="timeFormat(datum.value, '%m') == '01' ? timeFormat(datum.value, '%Y') : timeFormat(datum.value, '%b')",
    ),
    alt.Y("values:Q"),
)

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.