【问题标题】:Altair - sorting continuous time axis daily data by month (Jun-May instead of Jan-Dec)Altair - 按月对连续时间轴每日数据进行排序(6 月至 5 月而不是 1 月至 12 月)
【发布时间】:2020-07-01 23:54:37
【问题描述】:

为清晰起见进行了重大编辑,并考虑了@jakevdp 评论/答案

问题:绘制数据的时间序列(汇总为月份日期),其中 x 轴是 Jan-Dec 月份,并且每年的数据都是单独的颜色。但不是从 1 月到 12 月,而是从 6 月到 5 月对轴进行排序(从科学上讲,这是因为冬天是感兴趣的季节,并且希望它位于情节的中心)。

最初的问题不清楚,有用的解决方案指出了序数和时间编码以及排序与轴格式之间的差异

#produces plot desired but with jan-dec range
import pandas as pd
import altair as alt

df = pd.DataFrame({
    'date': pd.date_range('2019-01-01', freq='M', periods=50),
    'value': range(50)
})

alt.Chart(df).mark_line().encode(
    x=alt.X('month(date):O'),
    y='value:Q',
    color=alt.Color('year(date):N')
)

然后按月份排序

import pandas as pd
import altair as alt

df = pd.DataFrame({
    'date': pd.date_range('2018-01-01', freq='M', periods=50),
    'value': range(50)
})

alt.Chart(df).mark_line().encode(
    x=alt.X('month(date):O',
            sort=['Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec', 'Jan', 'Feb', 'Mar', 'Apr', 'May']),
    y='value:Q',
    color=alt.Color('year(date):N')
)

确实实现了我想要的情节风格

问题

这可以用月日期聚合数据来完成吗?

import pandas as pd
import altair as alt

df = pd.DataFrame({
    'date': pd.date_range('2018-01-01', freq='D', periods=500),
    'value': range(500)
})

alt.Chart(df).mark_line().encode(
    x=alt.X('month(date):O',
            sort=['Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec', 'Jan', 'Feb', 'Mar', 'Apr', 'May']),
    y='value:Q',
    color=alt.Color('year(date):N')
)

使用月份日期聚合而不是月份聚合?所以它不是阶梯式的

【问题讨论】:

  • 解决方案可能仍然是带有轴格式的复杂图表

标签: python altair vega


【解决方案1】:

对于序数时间单位,您可以通过按所需顺序列出月份来对类别进行排序,如 Vega-Lite sorting docs 中所述。例如:

import pandas as pd
import altair as alt

df = pd.DataFrame({
    'date': pd.date_range('2019-06-01', freq='M', periods=12),
    'value': range(12)
})

alt.Chart(df).mark_line().encode(
    x=alt.X('month(date):O',
            sort=['Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec', 'Jan', 'Feb', 'Mar', 'Apr', 'May']),
    y='value:Q'
)

对于时间编码,这种方法不起作用,因为数据被视为连续量。在这种情况下(假设数据按所需顺序),您可以尝试使用 axis format 而不是 timeUnit:

alt.Chart(df).mark_line().encode(
    x=alt.X('date:T', axis=alt.Axis(format='%b')),
    y='value:Q'
)

【讨论】:

  • 感谢@jakevdp - 这提供了一些清晰度。正如所怀疑的 - 数据编码为序数与时间是我的问题的一部分......并且似乎它必须按月(而不是月日)聚合,并且轴格式方法不允许逐年绘制。为了清楚起见,我也会根据这个答案显着改进我的问题
猜你喜欢
  • 2020-10-10
  • 2015-04-11
  • 2020-12-30
  • 2022-01-04
  • 1970-01-01
  • 2020-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多