You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Altair中按多列对条形图进行排序

实现Altair条形图的多列排序需求

要实现先按group字母顺序、再按value从小到大的多条件排序,Altair的sort参数支持传入多个EncodingSortField组成的列表,直接在编码中配置即可,无需额外处理DataFrame。

方法一:直接在Altair编码中配置多条件排序

import altair as alt
import pandas as pd

df = pd.DataFrame(
    {
        "unique_ID": ["a", "b", "c", "d", "e", "f"],
        "group": ["Group 1", "Group 1", "Group 3", "Group 3", "Group 3", "Group 2"],
        "value": [20, 10, 30, 50, 40, 60]
    }
)

alt.Chart(df).mark_bar().encode(
    y=alt.Y(
        "unique_ID",
        # 多条件排序规则:先按group升序(字母顺序),再按value升序
        sort=[
            alt.EncodingSortField(field="group", order="ascending"),
            alt.EncodingSortField(field="value", order="ascending")
        ]
    ),
    x="value",
    color="group",
)

代码说明

  • 第一个EncodingSortField指定按group字段升序排列,对应字母顺序的Group 1 → Group 2 → Group 3
  • 第二个EncodingSortField指定同一group内按value升序排列,最终y轴顺序会是b - a - f - c - e - d,完全匹配你的需求

方法二:先在Pandas中排序再传入Altair

如果更习惯先处理数据排序,也可以先对DataFrame做排序,再让Altair按排序后的顺序展示:

import altair as alt
import pandas as pd

df = pd.DataFrame(
    {
        "unique_ID": ["a", "b", "c", "d", "e", "f"],
        "group": ["Group 1", "Group 1", "Group 3", "Group 3", "Group 3", "Group 2"],
        "value": [20, 10, 30, 50, 40, 60]
    }
)

# 先按group和value升序排序
df_sorted = df.sort_values(by=["group", "value"], ascending=[True, True])

alt.Chart(df_sorted).mark_bar().encode(
    y=alt.Y("unique_ID", sort=list(df_sorted["unique_ID"])),
    x="value",
    color="group",
)

这种方法逻辑更直观,适合需要复用排序后数据的场景。

内容的提问来源于stack exchange,提问作者Revan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 10:33:38