小时和分钟作为跨度超过一天的 Altair 图中的标签

fug*_*ede 5 python data-visualization time-series vega-lite altair

我试图在 Altair 中创建时间范围跨越几天的时间序列图的 Vega-Lite 规范。由于在我的情况下,很清楚哪一天是哪一天,我想通过让标签的形式为 来减少轴标签中的噪音'%H:%M',即使这会导致标签不明显。

这是一些示例数据;我的实际数据有五分钟的分辨率,但我想这在这里不会太重要:

import altair as alt
import numpy as np
import pandas as pd

# Create data spanning 30 hours, or just over one full day
df = pd.DataFrame({'time': pd.date_range('2018-01-01', periods=30, freq='H'),
                   'data': np.arange(30)**.5})
Run Code Online (Sandbox Code Playgroud)

通过使用其他微不足道的yearmonthdatehoursminutes变换,我得到以下信息:

alt.Chart(df).mark_line().encode(x='yearmonthdatehoursminutes(time):T', 
y='data:Q')
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

现在,我的目标是去掉水平轴标签中的日期,让它们变成类似['00:00', '03:00', ..., '21:00', '00:00', '03:00'],或者任何间距效果最好的东西。

仅用hoursminutes作转换的幼稚方法是行不通的,因为它会存储实际数据:

alt.Chart(df).mark_line().encode(x='hoursminutes(time):T', y='data:Q')
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

那么,有没有一种声明式的方式来做到这一点?最终,可视化将利用选择来定义水平轴限制,因此明确使用指定标签Axis似乎并不吸引人。

jak*_*vdp 6

为了扩展 @fuglede 的答案,Altair 中的日期和时间有两个不同的概念。

时间格式允许您指定时间在轴上的显示方式;它们看起来像这样:

chart.encode(
    x=alt.X('time:T', axis=alt.Axis(format='%H:%M'))
)
Run Code Online (Sandbox Code Playgroud)

Altair 使用d3-time-format中的格式代码。

时间单位允许您指定数据的分组方式,并且它们还可以调整默认时间格式以进行匹配。它们看起来像这样:

chart.encode(
    x=alt.X('time:T', timeUnit='hoursminutes')
)
Run Code Online (Sandbox Code Playgroud)

或通过简写:

chart.encode(
    x='hoursminutes(time):T'
)
Run Code Online (Sandbox Code Playgroud)

此处列出了可用的时间单位。

如果您只想调整轴格式,请使用时间格式。如果您想根据时间跨度进行分组(即按年、按月、按小时等对数据进行分组),请使用时间单位。Altair 文档中提供了此类示例,例如Altair 示例库中的西雅图天气热图。