使用 Altair 直接标记线图

我正在 Altair (4.1.0) 中绘制折线图,并希望使用直接标签(注释)而不是常规图例。
因此,每条线(例如时间序列)的文本标记应该仅出现一次,并且出现在 x 轴的最右点(与标记每个数据点的散点图示例相反)。
虽然我可以使用 pandas 来操作数据以获得所需的结果,但我认为使用纯 Altair 实现会更优雅,但我似乎无法正确实现。

例如,给定以下数据:

import numpy as np

import pandas as pd

import altair as alt


np.random.seed(10)

time = pd.date_range(start="10/21/2020", end="10/22/2020", periods=n)

data = pd.concat([

    pd.DataFrame({

        "time": time,

        "group": "One",

        "value": np.random.normal(10, 2, n)}),

    pd.DataFrame({

        "time": time,

        "group": "Two",

        "value": np.random.normal(5, 2, n)}).iloc[:-1]

], ignore_index=True)

我可以使用 pandas 创建一个包含每个组的最后时间点的子集来生成令人满意的结果:


lines = alt.Chart(data).mark_line(

    point=True

).encode(

    x="time:T",

    y="value:Q",

    color=alt.Color("group:N", legend=None),  # Remove legend

)


text_data = data.loc[data.groupby('group')['time'].idxmax()]  # Subset the data for text positions

labels = alt.Chart(text_data).mark_text(

    # some adjustments

).encode(

    x="time:T",

    y="value:Q",

    color="group:N",

    text="group:N"

)


chart = lines + labels

https://img1.sycdn.imooc.com/6582a2d700011c1704770239.jpg

但是,如果我尝试使用主数据并添加 Altair 聚合(例如使用x=max(time)或explicit transform_aggregate()),我要么在所有点上获得文本注释,要么根本没有(分别)。

有没有更好的方法来获得上述结果?


月关宝盒
浏览 52回答 1
1回答

MYYA

您可以使用argmaxy 编码中的聚合来执行此操作。例如,您的标签层可能如下所示:labels = alt.Chart(data).mark_text(    align='left', dx=5).encode(    x='max(time):T',    y=alt.Y('value:Q', aggregate={'argmax': 'time'}),    text='group:N',    color='group:N',)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python