gpt4 book ai didi

python - 使用 Altair 直接标记线图

转载 作者:行者123 更新时间:2023-12-04 13:11:42 25 4
gpt4 key购买 nike

我正在 Altair (4.1.0) 中绘制折线图,​​并希望使用直接标记(注释)而不是常规图例。
因此,每一行的文本标记(例如,时间序列)应该只出现一次,并且出现在 x 轴的最右边(与 this scatter plot example labeling every data point 相对)。
虽然我能够使用 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

enter image description here

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

有没有更好的方法得到上面的结果?

最佳答案

您可以在 y 编码中使用 argmax 聚合来执行此操作。例如,您的标签层可能如下所示:

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',
)

enter image description here

关于python - 使用 Altair 直接标记线图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64467240/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com