我正在 Altair (4.1.0) 中繪制折線圖,并希望使用直接標(biāo)簽(注釋)而不是常規(guī)圖例。因此,每條線(例如時(shí)間序列)的文本標(biāo)記應(yīng)該僅出現(xiàn)一次,并且出現(xiàn)在 x 軸的最右點(diǎn)(與標(biāo)記每個(gè)數(shù)據(jù)點(diǎn)的散點(diǎn)圖示例相反)。雖然我可以使用 pandas 來操作數(shù)據(jù)以獲得所需的結(jié)果,但我認(rèn)為使用純 Altair 實(shí)現(xiàn)會(huì)更優(yōu)雅,但我似乎無法正確實(shí)現(xiàn)。例如,給定以下數(shù)據(jù):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 創(chuàng)建一個(gè)包含每個(gè)組的最后時(shí)間點(diǎn)的子集來生成令人滿意的結(jié)果: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但是,如果我嘗試使用主數(shù)據(jù)并添加 Altair 聚合(例如使用x=max(time)或explicit transform_aggregate()),我要么在所有點(diǎn)上獲得文本注釋,要么根本沒有(分別)。有沒有更好的方法來獲得上述結(jié)果?
使用 Altair 直接標(biāo)記線圖
月關(guān)寶盒
2023-12-20 16:14:38