admin管理员组

文章数量:1318021

Using a data frame of dates and values starting from 1 Jan 2022:

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()

But if I start the data frame from 2020 and filter it for dates > 1 Jan 2022:

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()

How can I specify that years must be shown?

Note that I do get the right result if I filter using >= to include 1 Jan 2022, but that's besides the point. I always need years.

Using a data frame of dates and values starting from 1 Jan 2022:

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()

But if I start the data frame from 2020 and filter it for dates > 1 Jan 2022:

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()

How can I specify that years must be shown?

Note that I do get the right result if I filter using >= to include 1 Jan 2022, but that's besides the point. I always need years.

Share Improve this question edited Jan 22 at 16:44 Thomas Browne asked Jan 22 at 16:26 Thomas BrowneThomas Browne 24.9k33 gold badges82 silver badges133 bronze badges
Add a comment  | 

1 Answer 1

Reset to default 2

You can use labelExpr to build your own logic for setting tick labels. For example, this gives the year if the month is January and the month otherwise.

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"),
)

本文标签: pythonForce Altair chart to display yearsStack Overflow