如何从时间序列图中排除某些日期(例如周末)?
How can I exclude certain dates (e.g., weekends) from time series plots?
在下面的示例中,我想排除周末并将 Y
绘制为一条直线,并为主要刻度标签指定一些自定义频率,因为它们将是 "broken" 时间序列(例如,每周一 matplotlib
的 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'
)
一种快速的方法是将轴指定为序数字段。这会产生一个非常难看的轴,每个刻度都指定了小时数。要更改它,我将一列添加到具有给定标签的数据框中。我还添加了 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'
)
注意它会删除任何遗漏的点。所以,也许您想添加一个工具提示。这在文档 here 中进行了讨论。
您还可以根据需要在轴设置中使用 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
在下面的示例中,我想排除周末并将 Y
绘制为一条直线,并为主要刻度标签指定一些自定义频率,因为它们将是 "broken" 时间序列(例如,每周一 matplotlib
的 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'
)
一种快速的方法是将轴指定为序数字段。这会产生一个非常难看的轴,每个刻度都指定了小时数。要更改它,我将一列添加到具有给定标签的数据框中。我还添加了 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'
)
注意它会删除任何遗漏的点。所以,也许您想添加一个工具提示。这在文档 here 中进行了讨论。
您还可以根据需要在轴设置中使用 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