如何解决使用Altair
我正在altair(4.1.0)中绘制折线图,并希望使用直接标记(注释)代替常规图例。
因此,每行(例如,时间序列)的文本标记应仅出现一次,并出现在x轴的最右端(与this scatter plot example labeling every data point相对)。
虽然我可以使用熊猫来操纵数据以获得期望的结果,但我认为使用纯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,n)}).iloc[:-1]
],ignore_index=True)
我可以使用熊猫创建令人满意的结果,创建一个包括每个组的最后时间点的子集:
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",color="group:N",text="group:N"
)
chart = lines + labels
但是,如果我尝试使用主数据并添加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',)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。