6

在下面的示例中,我想排除周末并绘制Y为一条直线,并为主要刻度标签指定一些自定义频率,因为它们将是一个“破碎”的时间序列(例如,每周一,la matplotlib's set_major_locator)。

我将如何在 Altair 中做到这一点?

import altair as alt
import pandas as pd

index = pd.date_range('2018-01-01', '2018-01-31', freq='B')
df = pd.DataFrame(pd.np.arange(len(index)), index=index, columns=['Y'])

alt.Chart(df.reset_index()).mark_line().encode(
    x='index',
    y='Y'
)

在此处输入图像描述

4

1 回答 1

3

一种快速的方法是将轴指定为序数字段。这将产生一个非常丑陋的轴,为每个刻度指定小时数。为了改变这一点,我在给定标签的数据框中添加了一列。我还添加了grid,因为默认情况下它被删除以进行序数编码,并将 设置labelAngle为 0。

df2 = df.assign(label=index.strftime('%b %d %y'))

alt.Chart(df2).mark_line().encode(
    x=alt.X('label:O', axis=alt.Axis(grid=True, labelAngle=0)),
    y='Y:Q'
)

altair 图表序数轴

请注意,它会删除任何缺失的点。所以,也许你想添加一个工具提示。这在此处的文档中进行了讨论。labelOverlap您还可以根据您想要的帽子在轴设置中玩。


要自定义轴,我们可以使用自定义数据框构建mark_text并带回网格mark_rule。它不一定能很好地扩展,但它可以给你一些想法。

df3 = df2.loc[df2.index.dayofweek == 0, :].copy()
df3["Y"] = 0

text_chart = alt.Chart(df3).mark_text(dy = 15).encode(
    x=alt.X('label:O', axis = None),
    y=alt.Y('Y:Q'),
    text=alt.Text('label:O')
)

tick_chart = alt.Chart(df3).mark_rule(color='grey').encode(
    x=alt.X('label:O', axis=None),
)

line_chart = alt.Chart(df2).mark_line().encode(
    x=alt.X('label:O', axis=None, scale=alt.Scale(rangeStep=15)),
    y='Y:Q'
)
text_chart + tick_chart + line_chart 

在此处输入图像描述

于 2018-12-17T13:00:24.713 回答