X 轴上的奇怪年份值

strange year values on X axis

如果我使用 vega 数据集 "disasters" 并制作一个简单的图表,我会得到一些奇怪的年份值。

在 Altair 中,代码是:

import altair as alt
from vega_datasets import data

dis=data.disasters()

alt.Chart(dis).mark_bar().encode(
    x=alt.X('Year:T'),
    y=alt.Y('Deaths'),
    color='Entity'
)

(vega editor link)

年份整数不是标准时间值。

在 Vega-Lite 中,您可以将 "format": {"parse": {"Year": "date: '%Y'"}} 添加到数据块以指定字段 "year".

的自定义日期解析格式

See a working spec

在 Altair 中,您可以类似地指定 *Data class 的 format 属性(例如,NamedData)。

添加到@kanitw 的回答:当您将整数转换为日期时间时,该整数被视为自零日期起的纳秒数。您可以通过执行以下命令在 pandas 中看到这一点:

>>> pd.to_datetime(dis.Year)
0   1970-01-01 00:00:00.000001900
1   1970-01-01 00:00:00.000001901
2   1970-01-01 00:00:00.000001902
3   1970-01-01 00:00:00.000001903
4   1970-01-01 00:00:00.000001905
Name: Year, dtype: datetime64[ns]

Altair/Vega-Lite 使用类似的约定。

如果您想在加载数据时将年份解析为日期,然后使用 Altair 绘制年份,您可以执行以下操作:

import altair as alt
from vega_datasets import data

dis=data.disasters(parse_dates=['Year'])

alt.Chart(dis).mark_bar().encode(
    x=alt.X('year(Year):T'),
    y=alt.Y('Deaths'),
    color='Entity'
)

首先,我们通过将适当的 pandas.read_csv 参数传递给加载函数,将年份列解析为日期,然后使用 year timeUnit 从完整的日期时间。

如果您从 CSV URL 而不是 pandas 数据帧绘制数据,Vega-Lite 足够智能,可以根据您在图表中指定的编码解析 CSV 文件,这表示以下将给出相同的结果:

dis=data.disasters.url

alt.Chart(dis).mark_bar().encode(
    x=alt.X('year(Year):T'),
    y=alt.Y('Deaths:Q'),
    color='Entity:N'
)