小时和分钟作为 Altair 图中的标签,跨越一天以上

Posted

技术标签:

【中文标题】小时和分钟作为 Altair 图中的标签,跨越一天以上【英文标题】:Hours and minutes as labels in Altair plot spanning more than one day 【发布时间】:2020-06-06 14:53:16 【问题描述】:

我正在尝试在 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)

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

alt.Chart(df).mark_line().encode(x='yearmonthdatehoursminutes(time):T', 
y='data:Q')

现在,我的目标是去掉横轴标签中的日期,使它们变成['00:00', '03:00', ..., '21:00', '00:00', '03:00'] 之类的东西,或者任何最合适的间距。

只使用hoursminutes 作为转换的天真方法是行不通的,因为它会合并实际数据:

alt.Chart(df).mark_line().encode(x='hoursminutes(time):T', y='data:Q')

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

【问题讨论】:

【参考方案1】:

这实际上可以通过在Axis 中指定format 来轻松实现:

alt.Chart(df).mark_line().encode(x=alt.X('time:T', axis=alt.Axis(format='%H:%M')), y='data:Q')

【讨论】:

【参考方案2】:

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

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

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

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

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

chart.encode(
    x=alt.X('time:T', timeUnit='hoursminutes')
)

或通过简写:

chart.encode(
    x='hoursminutes(time):T'
)

列出了可用的时间单位here。

如果您只想调整轴格式,请使用时间格式。如果您想根据时间跨度进行分组(即按年、按月、按小时等对数据进行分组),请使用时间单位。这方面的示例出现在 Altair 文档中,例如Altair 示例库中的 Seattle Weather Heatmap。

【讨论】:

以上是关于小时和分钟作为 Altair 图中的标签,跨越一天以上的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Altair 条形图中最左边的条不尊重选择画笔位置?

从开始和结束时间跨度得出的每分钟会话数

如何在 altair.layered 图中配置条形图?

如何在 altair 分层图中添加图例

Altair 条形图 - 标签放置和格式设置

每次我在前端放大/缩小时,如何以编程方式检查 Altair 图表的放大/缩小功能