为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Altair 直接标记线图

使用 Altair 直接标记线图

月关宝盒 2023-12-20 16:14:38
我正在 Altair (4.1.0) 中绘制折线图,并希望使用直接标签(注释)而不是常规图例。因此,每条线(例如时间序列)的文本标记应该仅出现一次,并且出现在 x 轴的最右点(与标记每个数据点的散点图示例相反)。虽然我可以使用 pandas 来操作数据以获得所需的结果,但我认为使用纯 Altair 实现会更优雅,但我似乎无法正确实现。例如,给定以下数据:import numpy as npimport pandas as pdimport altair as altnp.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 positionslabels = alt.Chart(text_data).mark_text(    # some adjustments).encode(    x="time:T",    y="value:Q",    color="group:N",    text="group:N")chart = lines + labels但是,如果我尝试使用主数据并添加 Altair 聚合(例如使用x=max(time)或explicit transform_aggregate()),我要么在所有点上获得文本注释,要么根本没有(分别)。有没有更好的方法来获得上述结果?
查看完整描述

1 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

您可以使用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',

)

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

查看完整回答
反对 回复 2023-12-20
  • 1 回答
  • 0 关注
  • 46 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信