我正在 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',
)
添加回答
舉報
0/150
提交
取消