我正在 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
但是,如果我尝试使用主数据并添加 Altair 聚合(例如使用x=max(time)
或explicit transform_aggregate()
),我要么在所有点上获得文本注释,要么根本没有(分别)。
有没有更好的方法来获得上述结果?
MYYA
相关分类