Altair如何将DataFrame其他列用作柱状图的轴标签?
你之前的写法失效的核心原因是:Axis配置里的labelExpr的datum对象只能访问当前轴刻度的属性,你给X轴绑定的是name字段,所以轴的上下文里只有name对应的刻度值,没有原始DataFrame中的another字段,自然读取不到值,标签显示为空。
不需要新增图层就可以实现需求,有两种常用方案:
方案1:直接映射X轴为another字段(不需要保留原name排序时用)
如果不需要让柱子按原来的name字段顺序排列,直接把X轴的绑定字段改成another即可:
df = pd.DataFrame({'name':['bar','foo'], "another": ['a', 'b'], 'value':[10,20]}) (alt.Chart(df, height=250, width=375).mark_bar() .encode(x='another', y='value') )
方案2:保留原name字段的排序顺序
如果你需要柱子的排序和原name的顺序一致,有两种实现方式:
方式A:指定X轴排序规则
把X轴映射为another字段,同时指定排序规则按name字段排序:
(alt.Chart(df, height=250, width=375).mark_bar() .encode( x=alt.X('another', sort=alt.EncodingSortField(field='name', order='ascending')), y='value' ) )
方式B:通过labelExpr写映射关系
如果一定要把X轴绑定到name字段,可以在labelExpr里写映射字典,把name的取值对应到another的取值,支持动态生成字典适配多数据场景:
import json # 动态生成映射字典,不需要手动写键值 label_map = df.set_index('name')['another'].to_dict() label_map_str = json.dumps(label_map) (alt.Chart(df, height=250, width=375).mark_bar() .encode( x=alt.X('name', axis=alt.Axis(labelExpr=f"{label_map_str}[datum.value]")), y='value' ) )
内容的提问来源于stack exchange,提问作者neves
相关产品推荐
相关产品推荐

