【问题标题】:How to build a cycle plot in Python Altair?如何在 Python Altair 中构建循环图?
【发布时间】:2022-11-14 06:22:18
【问题描述】:

我想在 Altair 中绘制下图。有任何想法吗?

我有这个数据集:

我试过了

alt.Chart(df).mark_line().encode(
    x='Month',
    y='Mean'
)

但输出完全错误。

【问题讨论】:

  • 您的示例图表由多个元素组成。您无法使用您的代码实现示例图表。示例图由水平堆叠在一起的 12 个单独的图组成。每个图包括一个面积图和一个平均折线图。尝试找出单个月图;之后,您可以将它们堆叠在一起以实现您想要的。

标签: python time-series visualization altair timeserieschart


【解决方案1】:

由于我没有确切的数据框或您如何处理它,我假设“平均值”列是指数据集中罢工报告的平均值。

您可以通过将三个图分层来创建这种图:

  1. mark_line 每年都有一个点(总罢工报告)
  2. mark_area
  3. mark_line 平均值(多年来罢工报告的平均值)

    将三个图表分层后,我们可以使用facet 为每个月创建多个图表。

    以下是我为整理数据必须执行的步骤:

    required = df[(df["Incident Year"] >= "2000") & (df["Incident Year"] <= "2010")] # filter dataset for years between 2000 and 2010
    
    mean_df = required.groupby(by = ["Incident Month", "Incident Year"]).sum().groupby(by = ["Incident Month"]).mean() # to get the mean of the (total strike reports every year) for each month
    
    merged_df = pd.merge(mean_df, new_df, on = "Incident Month") # merge the two dataframes
    

    在争论之前,数据看起来像这样:

    df before wrangling

    争论之后,数据看起来像这样:

    merged_df.head()
    

    df after wrangling

    最后,这三个图可以通过以下方式定义,然后分层和分面:

    x = alt.Chart(merged_df).mark_line(color = 'darkblue').encode(
        x='Incident Year',
        y=alt.Y('sum(Strikes_x)', title='Number of Strike Reports')
    )
    
    y = alt.Chart(merged_df).mark_area(color = 'lightblue').encode(
        x='Incident Year',
        y='sum(Strikes_x)'
    )
    
    z = alt.Chart(merged_df).mark_line(color='black').encode(
        x='Incident Year',
        y='Strikes_y'
    )
    (x+y+z).properties(
        width=50,
        height=300
    ).facet(column = 'Incident Month')
    

    最后,图表看起来像这样:

    Final Plot

    希望这有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 2021-10-15
    • 2020-02-15
    相关资源
    最近更新 更多