Часы и минуты в виде меток на графике Альтаира, охватывающих более одного дня - PullRequest
5 голосов
/ 22 февраля 2020

Я пытаюсь создать в 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')

enter image description here

Теперь моя цель - избавиться от дат в метках на горизонтальной оси, чтобы они стали чем-то вроде ['00:00', '03:00', ..., '21:00', '00:00', '03:00'] или любым другим интервалом работает лучше всего.

Наивный подход, заключающийся в использовании hoursminutes в качестве преобразования, не сработает, так как он объединяет фактические данные:

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

enter image description here

Итак, есть ли декларативный способ сделать это? В конечном счете, визуализация будет использовать выборки для определения границ горизонтальной оси, поэтому явное указание меток с помощью Axis не кажется привлекательным.

Ответы [ 2 ]

2 голосов
/ 22 февраля 2020

Чтобы расширить ответ @ fuglede, в Altair действуют две разные концепции с датами и временем.

Форматы времени позволяют указать, как время отображается на оси; они выглядят так:

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

Альтаир использует коды формата из d3-time-format .

Единицы времени позволяют указать, как данные будут сгруппированы, и они также регулируют формат времени по умолчанию, чтобы соответствовать. Они выглядят примерно так:

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

или через стенографию:

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

Здесь перечислены доступные единицы времени здесь .

Если вы хотите настроить только форматы осей, используйте форматы времени. Если вы хотите группировать данные на основе временных интервалов (то есть группировать данные по годам, месяцам, часам и т. Д. c.), Используйте единицу времени. Примеры этого приведены в документации Альтаира, например, Тепловая карта погоды Сиэтла в галерее примеров Альтаира.

1 голос
/ 22 февраля 2020

Этого можно легко достичь, указав format в Axis:

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

enter image description here

...